Winapi 如何使用ShellExecuteEx()而不窃取opener窗口的焦点
我试图通过我的应用程序打开浏览器,但我不希望它在前台运行,并从我的应用程序中窃取焦点 代码:Winapi 如何使用ShellExecuteEx()而不窃取opener窗口的焦点,winapi,Winapi,我试图通过我的应用程序打开浏览器,但我不希望它在前台运行,并从我的应用程序中窃取焦点 代码: case WM_COMMAND: { SHELLEXECUTEINFO ShExecInfo; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = NULL; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = L"open"; ShExecI
case WM_COMMAND:
{
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"open";
ShExecInfo.lpFile = L"http://www.microsoft.com";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
SetForegroundWindow(hwnd);
}
return 0;
在我的应用程序中,有一个按钮正在发送命令消息以执行开始代码,但我的应用程序转到后台,浏览器转到前台
如何解决此问题?我建议您改为使用
CreateProcess()
启动浏览器,并在初始化的STARTUPINFO
结构中,在dwFlags
和wShowWindow
中使用STARTF\u USESHOWWINDOW
中,确保包含SW\u SHOWNOACTIVATE
标志。这将允许进程启动,但不会成为活动窗口。你可以让它从你的应用程序中窃取焦点,然后通过编程方式切换回你的应用程序。在ShellExecuteEx()之前调用LockSetForegroundWindow()
可能会起作用。为什么你要尝试启动带有SW\u HIDE
标志的浏览器?在任何情况下,请尝试使用SW\u SHOWNOACTIVATE
:“以最新的大小和位置显示窗口。活动窗口保持活动状态。”没有SW\u NOACTIVATE
标志,实际名称为SW\u SHOWNOACTIVATE
。您还可以将其传递到ShellExecute/Ex()
。如果使用CreateProcess()
,则必须知道浏览器EXE的确切路径、文件名和参数ShellExecute/Ex()
可以为您解决这些细节。公平地说,编辑器上没有编译器:-)我使用CreateProcess b/c如果您的URL包含锚,ShellExecute将失败。使用AssocQueryString和SheValuesSystemCommandTemplate让操作系统为您构建路径。