我使用此功能在 Chrome 中打开新标签并激活它:
ShellExecuteA(0,0,"chrome.exe","http://google.com --incognito",0,SW_SHOWMAXIMIZED);
但 Chrome 只打开新标签,但它没有活动窗口。
(如果用户按下指定的键,我会从没有用户界面的应用程序的全局键盘挂钩调用此函数)。
我该如何解决?
我使用此功能在 Chrome 中打开新标签并激活它:
ShellExecuteA(0,0,"chrome.exe","http://google.com --incognito",0,SW_SHOWMAXIMIZED);
但 Chrome 只打开新标签,但它没有活动窗口。
(如果用户按下指定的键,我会从没有用户界面的应用程序的全局键盘挂钩调用此函数)。
我该如何解决?
看起来像 chrome.exe 中的错误。ShellExecute
如果常规(非隐身)chrome.exe 会话正在运行并且没有隐身会话正在运行,我可以通过一个简单的控制台应用程序来重现您的呼叫。换句话说,如果需要生成新的隐身 chrome 会话,则常规会话似乎无法将ShowWindow
标志正确地传播到生成的隐身进程。另一个因素是激活失败还需要在测试应用程序运行之前激活常规 chrome 会话。如果任何其他应用程序处于活动状态(例如 notepad.exe),则隐身会话的激活成功。ShellExecuteEx
和发生相同的行为CreateProcess
。观察Process Explorer
(来自 sysinternals),很明显 chrome.exe 在必要时分叉子进程,然后自行终止。这使得难以拦截 hProcess 或 processId 以便最终调用SetActiveWindow
.
这是不可能的。您必须将 Google Chrome 设为默认浏览器,然后尝试以下操作:
(仅在使用 IE6 的 WinXP 上测试)
首先是一个函数,用于查找任何文件扩展名的默认应用程序:**
在这里输入代码
#include<Registry.hpp>
AnsiString GetDefaultApp(AnsiString ext)
{
TRegistry* reg = new(TRegistry);
reg->RootKey = HKEY_CURRENT_USER;
if(!reg->OpenKeyReadOnly("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\."+ext+"\\OpenWithList"))
return(NULL);
try
{
AnsiString MRUList = reg->ReadString("MRUList");
AnsiString ret = reg->ReadString(AnsiString(char(MRUList[1])));
return(ret);
}
catch(...)
{
return(NULL);
}
}
现在是启动 html 文件的默认应用程序并将 URL 作为参数提供的代码:**
#include<shellapi>
void OpenURL(AnsiString URL)
{
AnsiString app = GetDefaultApp("html");
if(app == NULL)
return;
ShellExecute(NULL,"open",app.c_str(),URL.c_str(),NULL,SW_SHOWDEFAULT);
}
现在您可以使用以下命令在新浏览器中打开 URL:
OpenURL("http://www.AlgorithMan.de/");