我使用此功能在Chrome中打开新标签并激活它:
ShellExecuteA(0,0,"chrome.exe","http://google.com --incognito",0,SW_SHOWMAXIMIZED);
但Chrome只会打开新标签,但它不会显示活动窗口 (如果用户按下指定的键,我从没有用户界面的应用程序的全局键盘钩子调用此函数。)
我该如何解决?
答案 0 :(得分:1)
看起来像chrome.exe中的错误。如果常规(非隐身)chrome.exe会话正在运行且没有运行隐身会话,我可以通过简单的控制台应用程序进行ShellExecute
来电。换句话说,如果需要生成新的隐身Chrome会话,则常规会话似乎无法正确地将ShowWindow
标记传播到生成的隐身过程。另一个因素是激活失败还需要在测试应用程序运行之前激活常规chrome会话。如果任何其他应用程序处于活动状态(例如notepad.exe),则激活隐身会话成功。 ShellExecuteEx
和CreateProcess
也会出现同样的问题。在Process Explorer
(来自sysinternals)中观察,很明显chrome.exe根据需要分配子进程,然后终止自身。这使得很难拦截hProcess或processId以最终调用SetActiveWindow
。
答案 1 :(得分:0)
不可能。您必须将Google Chrome设置为默认浏览器,然后尝试以下操作:
(仅在WinXP上测试使用 IE6)强>
首先找到一个函数,找到任何文件扩展名的默认应用程序:**
在这里输入代码
#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/");