C++ 子进程窃取焦点。如何在不打扰用户的情况下将其取回?
我从控制台应用程序创建了子进程C++ 子进程窃取焦点。如何在不打扰用户的情况下将其取回?,c++,winapi,C++,Winapi,我从控制台应用程序创建了子进程 CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &in, &out); 在哪里 command是我运行的应用程序的命令行pvw32 img.jpg(显示一些图像) 在中是一个STARTUPINFO结构(我尝试了STARTF_USESHOWWINDOW标志,但运气不好,pictView通过它的一些进程窃取了焦点) 我试着给pictView一些时间,然后好心地收回焦点 S
CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &in, &out);
在哪里
是我运行的应用程序的命令行command
(显示一些图像)pvw32 img.jpg
中是一个STARTUPINFO结构(我尝试了STARTF_USESHOWWINDOW标志,但运气不好,pictView通过它的一些进程窃取了焦点)在
Sleep(1000);
SwitchToThisWindow(hwnd,TRUE);
我获得了焦点(光标在我的控制台中再次闪烁),但任务栏中的图标闪烁了几次,在我点击Alt+Tab之前不允许输入
我还试图设置z顺序,启动pictView最小化,甚至暂停它,但他不想轻易放弃。恢复焦点的唯一方法是关闭pictView
有没有办法在不干扰用户使用Alt+Tab键的情况下恢复焦距?
注意:没有焦点窃取问题,但出于性能原因,我想继续使用pictView。正如Remy Lebeau指出的,概述了将前景设置为前景的要求。pictView玩得很脏,所以我:
从控制台应用程序执行阻止pictView窃取其焦点。现在一切运行正常。您可以尝试将STARTUPINFO.wShowWindow设置为SW_SHOWNOACTIVATE。然而,这只是对流程的一个提示,它不必使用它。除了使用
STARTF\u USESHOWWINDOW
标志外,您是否还将STARTUPINFO
结构的wShowWindow
值设置为类似SW_SHOWNOACTIVATE
或SW_SHOWMINNOACTIVATE
的值?是的,我尝试过,然而,pictView只是忽略了它。我想知道是否有一种方法可以在沙盒中启动pictView,教它如何处理好程序?你的任务栏按钮闪烁意味着你的应用程序不允许自动将窗口放回前台。的文档概述了将前台设置为前台的要求。一旦你的应用程序启动pictView并弹出到前台,你的应用程序就不再有资格在没有用户干预的情况下收回前台(即,单击闪烁的任务栏按钮或窗口的Alt+选项卡)。我不知道你是否意识到这一点,但所有应用程序,甚至控制台应用程序,都可以创建窗口。特别是考虑到您已经在关注性能,有一种可能更简单的方法:首先不要启动新流程,而是创建自己的查看器。
LockSetForegroundWindow(LSFW_LOCK);