首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetForegroundWindow被忽略了

SetForegroundWindow被忽略了
EN

Stack Overflow用户
提问于 2014-03-17 16:06:55
回答 1查看 833关注 0票数 0

我写了一个小实用程序,允许我多路输入到多个终端窗口;

表单接收到的任何输入(在中心)被中继到它管理的所有终端窗口。

这很好,但如果我在终端前移动另一个窗口,就会出现一个问题。输入表单是Topmost,所以总是可见的,但是终端会话是隐藏的。

为了解决这个问题,双击输入窗口将遍历所有终端并依次调用SetForegroundWindow (从user32.dll)。

代码语言:javascript
复制
For Each Manager In Managers
    SetForegroundWindow(ProcessInfo.MainWindowHandle)
    'Threading.Thread.Sleep(15)
Next

如果我在没有Thread.Sleep(15)的情况下进行此调用,则只会将列表中的第一个和最后一个窗口带到前台。Sleep可以解决这个问题,但有点麻烦(当有很多终端打开时,它会有点难看)。

我想我是打了一些内部窗口滴答频率,在那里最多一个窗口可以被带到前面的每个滴答。

我的假设正确吗?有办法绕过这个限制吗?某种类似于MoveAllToForeground()的东西,还是一种排队的方式?

编辑:

澄清:我正在自动化的终端进程不是我的应用程序的一部分,它是PuTTY

如果我把对SetForegroundWindow的调用换成BringWindowToTop,就会遇到一个类似的问题--尽管在这种情况下,只有第一个终端被带到了前面,其余的则停留在任何其他窗口之后。

编辑2:

以下是大卫的建议。声明:

代码语言:javascript
复制
Private Declare Auto Function SetWindowPos Lib "user32.dll" (
    ByVal hWnd As IntPtr,
    ByVal hWndInsertAfter As IntPtr,
    ByVal X As Integer,
    ByVal Y As Integer,
    ByVal cx As Integer,
    ByVal cy As Integer,
    ByVal uFlags As SetWindowPosFlags
    ) As Boolean

Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)
Private Shared ReadOnly HWND_TOP As New IntPtr(0)
Private Shared ReadOnly HWND_BOTTOM As New IntPtr(1)

Private Enum SetWindowPosFlags
    NOSIZE = &H1
    NOMOVE = &H2
    NOZORDER = &H4
    NOREDRAW = &H8
    NOACTIVATE = &H10
    DRAWFRAME = &H20
    FRAMECHANGED = &H20
    SHOWWINDOW = &H40
    HIDEWINDOW = &H80
    NOCOPYBITS = &H100
    NOOWNERZORDER = &H200
    NOREPOSITION = &H200
    NOSENDCHANGING = &H400
    DEFERERASE = &H2000
    ASYNCWINDOWPOS = &H4000
End Enum

那个电话..。

代码语言:javascript
复制
SetWindowPos(ProcessInfo.MainWindowHandle,
             HWND_TOP,
             0, 0, 0, 0,
             SetWindowPosFlags.NOMOVE Or
             SetWindowPosFlags.NOSIZE Or
             SetWindowPosFlags.NOACTIVATE)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-17 16:18:07

显然,你想把这些窗户放在前面,而不是让它们成为前景窗口。这样做的方法是调用SetWindowPos传递HWND_TOP。您需要将SWP_NOMOVE | SWP_NOSIZE作为uFlags参数传递,因为您只想更改z顺序,而不是位置和大小。

每次调用SetWindowPos之后,调用SetForegroundWindow传递应用程序的主窗口句柄。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22459389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档