使用Win32 API在C#中将窗口置于前端

时间:2008-08-06 00:55:48

标签: c# winapi

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

使用win32 API进行此操作的最佳方法是什么?我已经尝试过SetForeground()但它总是窃取焦点并且不能保持一致。

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

6 个答案:

答案 0 :(得分:15)

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

  

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

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

答案 1 :(得分:5)

  

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您可以尝试使用BringWindowToTop功能来防止对焦。我没有使用它,但它似乎是你正在寻找的。

答案 4 :(得分:1)

SetWindowPos + SWP_NOACTIVATE完成这项工作。

答案 5 :(得分:0)

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