我正在编写一个应用程序,需要将外部应用程序的窗口带到前台,并且不一定会窃取焦点(用户可以切换到窃取/不窃取焦点的设置)。

使用 win32 API 解决此问题的最佳方法是什么?我尝试过 SetForeground() 但它总是抢走焦点并且不能始终如一地工作。

解决这个问题的最佳方法是什么?有什么想法吗?

有帮助吗?

解决方案

SetForegroundWindow 应该会窃取焦点,但在某些情况下它会失败。

SetForegroundWindow函数将创建指定窗口的线程置于前台并激活该窗口。键盘输入定向到窗口

尝试用以下方式捕捉焦点 设置捕获 在拨打电话之前。还要研究将窗口置于前面的不同方法:SetForeGroundWindow、SetActiveWindow,甚至模拟鼠标单击都可以做到这一点。

其他提示

SetForeGroundWindow、SetActiveWindow 和 BringWindowToTop 之间有什么区别?看起来他们都在做同样的事情。

根据 MSDN,SetForeGroundWindow 将激活窗口并将键盘焦点定向到它。即使您的进程位于后台,这也会尝试工作。SetActiveWindow 与 SetForeGroundWindow 执行相同的操作,但如果您的应用程序不是最前面的应用程序,则它不会执行任何操作。最后,BringWindowToTop 仅将窗口移至顶部,并且不会更改键盘焦点。

您可以尝试 BringWindowToTop 函数来不窃取焦点。我没用过,但它似乎就是你要找的。

您是否尝试过使用 SetWindowPos.这是 Windows 中移动、调整大小和设置 z 顺序的规范函数。您可以使用 SWP_NOACTIVATE 标志。看着 http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx. 。我还没有在属于另一个进程的窗口上尝试过这个,但它可能值得一试。

SetWindowPos + SWP_NOACTIVATE 完成这项工作。

您可以使用 FindWindow 获取窗口的 HWND,然后使用 Win32 API 中的 BringWindowToTop 函数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top