[英]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),則激活隱身會話成功。 ShellExecuteEx
和CreateProcess
也會出現相同的行為。 在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.