簡體   English   中英

用ShellExecute打開URL - SW_SHOWMAXIMIZED在C ++中沒有活動窗口

[英]Open URL with ShellExecute - SW_SHOWMAXIMIZED dont active window in C++

我使用此功能在Chrome中打開新標簽並激活它:

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

但Chrome只打開新標簽,但它沒有活動窗口。
(如果用戶按下指定鍵,我從沒有用戶界面的應用程序的全局鍵盤鈎子調用此函數)。

我該怎么辦呢?

看起來像chrome.exe中的一個錯誤。 如果正常(非隱身)chrome.exe會話正在運行且沒有運行隱身會話,我可以通過簡單的控制台應用程序重新調用您的ShellExecute調用。 換句話說,如果需要生成新的隱身會話鉻會話,則常規會話似乎沒有正確地將ShowWindow標志傳播到衍生的隱身過程。 另一個因素是激活失敗還需要在測試應用程序運行之前激活常規chrome會話。 如果任何其他應用程序處於活動狀態(例如notepad.exe),則激活隱身會話成功。 ShellExecuteExCreateProcess也會出現相同的行為。 Process Explorer觀察(來自sysinternals),很明顯chrome.exe根據需要分配子進程,然后自行終止。 這使得很難攔截hProcess或processId以最終調用SetActiveWindow

這是不可能的。 您必須將Google Chrome設置為默認瀏覽器,然后嘗試以下操作:

(僅使用IE6在WinXP上測試)

首先是一個函數,它找到任何File擴展的默認應用程序:**

在這里輸入代碼

#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/");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM