关于winapi:使用Win32 API在C#中将窗口带到最前面

关于winapi:使用Win32 API在C#中将窗口带到最前面

Bringing Window to the Front in C# using Win32 API

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

使用win32 API进行此操作的最佳方法是什么? 我已经尝试过SetForeground(),但是它总是会失去焦点,并且无法正常工作。

最好的方法是什么? 有什么想法吗?


SetForegroundWindow应该会抢占焦点,并且在某些情况下会失败。

The SetForegroundWindow function puts the thread that created the specified window into the foreground and activates the window. Keyboard input is directed to the window

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


What is the difference between SetForeGroundWindow, SetActiveWindow, and BringWindowToTop? It appears as if they all do the same thing.

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


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


您可以尝试使用BringWindowToTop函数以免失去焦点。我没有用过,但这似乎是您要寻找的。


SetWindowPos + SWP_NOACTIVATE完成这项工作。


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


推荐阅读