3

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

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

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

我该如何解决?

4

2 回答 2

2

看起来像 chrome.exe 中的错误。ShellExecute如果常规(非隐身)chrome.exe 会话正在运行并且没有隐身会话正在运行,我可以通过一个简单的控制台应用程序来重现您的呼叫。换句话说,如果需要生成新的隐身 chrome 会话,则常规会话似乎无法将ShowWindow标志正确地传播到生成的隐身进程。另一个因素是激活失败还需要在测试应用程序运行之前激活常规 chrome 会话。如果任何其他应用程序处于活动状态(例如 notepad.exe),则隐身会话的激活成功。ShellExecuteEx和发生相同的行为CreateProcess。观察Process Explorer(来自 sysinternals),很明显 chrome.exe 在必要时分叉子进程,然后自行终止。这使得难以拦截 hProcess 或 processId 以便最终调用SetActiveWindow.

于 2013-06-02T21:48:42.123 回答
0

这是不可能的。您必须将 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/");
于 2013-06-04T11:44:08.133 回答