【问题标题】:Bringing Window to the Front in C# using Win32 API使用 Win32 API 在 C# 中将窗口置于最前面
【发布时间】:2010-09-05 09:40:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# winapi


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您可以尝试使用 BringWindowToTop 函数来避免窃取焦点。我没用过,但它似乎是你要找的。​​p>

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            SetWindowPos + SWP_NOACTIVATE 完成这项工作。

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-09-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-11-08
                • 1970-01-01
                • 1970-01-01
                • 2010-09-17
                相关资源
                最近更新 更多