用ShellExecute打开URL - SW_SHOWMAXIMIZED在C ++中没有活动窗口

时间:2013-05-15 07:06:47

标签: c++ google-chrome shellexecute

我使用此功能在Chrome中打开新标签并激活它:

ShellExecuteA(0,0,"chrome.exe","http://google.com  --incognito",0,SW_SHOWMAXIMIZED);

但Chrome只会打开新标签,但它不会显示活动窗口 (如果用户按下指定的键,我从没有用户界面的应用程序的全局键盘钩子调用此函数。)

我该如何解决?

2 个答案:

答案 0 :(得分:1)

看起来像chrome.exe中的错误。如果常规(非隐身)chrome.exe会话正在运行且没有运行隐身会话,我可以通过简单的控制台应用程序进行ShellExecute来电。换句话说,如果需要生成新的隐身Chrome会话,则常规会话似乎无法正确地将ShowWindow标记传播到生成的隐身过程。另一个因素是激活失败还需要在测试应用程序运行之前激活常规chrome会话。如果任何其他应用程序处于活动状态(例如notepad.exe),则激活隐身会话成功。 ShellExecuteExCreateProcess也会出现同样的问题。在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/");