46

我正在编写一个应用程序,该应用程序需要将外部应用程序的窗口置于前台,而不必窃取焦点(用户可以切换为窃取/不窃取焦点的设置)。

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

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

4

6 回答 6

17

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

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

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

于 2008-08-06T01:06:45.197 回答
6

SetForeGroundWindow、SetActiveWindow 和 BringWindowToTop 有什么区别?似乎他们都在做同样的事情。

根据 MSDN,SetForeGroundWindow 将激活窗口并将键盘焦点指向它。即使您的进程在后台,这也会尝试工作。SetActiveWindow 与 SetForeGroundWindow 做同样的事情,但如果您的应用程序不是最前面的应用程序,它不会做任何事情。最后,BringWindowToTop 只将窗口带到顶部,不会改变键盘焦点。

于 2008-08-06T13:20:08.103 回答
2

您可以尝试使用 BringWindowToTop 函数来避免窃取焦点。我没有使用它,但它似乎是你正在寻找的。

于 2008-08-06T01:37:37.710 回答
2

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

于 2008-08-24T21:51:34.570 回答
1

SetWindowPos + SWP_NOACTIVATE 完成这项工作。

于 2009-12-18T07:23:12.393 回答
0

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

于 2011-05-06T14:44:47.903 回答