winapi -使用Win32 API在C#中将窗口置于最前面

Translate

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

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

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

This question and all comments follow the "Attribution Required."

所有的回答

Mag Lee
Translate

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

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

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

来源
Translate

SetForeGroundWindow,SetActiveWindow和BringWindowToTop有什么区别?似乎他们都在做同一件事。

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

来源
Translate

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

来源
Translate

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

来源
Translate

SetWindowPos + SWP_NOACTIVATE完成这项工作。

来源
Translate

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

来源