我正在编写一个应用程序,该应用程序需要将外部应用程序的窗口置于前台,而不必窃取焦点(用户可以切换为窃取/不窃取焦点的设置)。
使用 win32 API 解决此问题的最佳方法是什么?我已经尝试过 SetForeground() 但它总是窃取焦点并且不能始终如一地工作。
解决此问题的最佳方法是什么?有什么想法吗?
SetForegroundWindow 应该窃取焦点,并且在某些情况下它会失败。
SetForegroundWindow 函数将创建指定窗口的线程置于前台并激活该窗口。键盘输入被定向到窗口
在拨打电话之前尝试使用SetCapture捕获焦点。还要研究将窗口置于前面的不同方法: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 函数。