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让操作系统为您构建路径。