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

表单接收到的任何输入(在中心)被中继到它管理的所有终端窗口。
这很好,但如果我在终端前移动另一个窗口,就会出现一个问题。输入表单是Topmost,所以总是可见的,但是终端会话是隐藏的。
为了解决这个问题,双击输入窗口将遍历所有终端并依次调用SetForegroundWindow (从user32.dll)。
For Each Manager In Managers
SetForegroundWindow(ProcessInfo.MainWindowHandle)
'Threading.Thread.Sleep(15)
Next如果我在没有Thread.Sleep(15)的情况下进行此调用,则只会将列表中的第一个和最后一个窗口带到前台。Sleep可以解决这个问题,但有点麻烦(当有很多终端打开时,它会有点难看)。
我想我是打了一些内部窗口滴答频率,在那里最多一个窗口可以被带到前面的每个滴答。
我的假设正确吗?有办法绕过这个限制吗?某种类似于MoveAllToForeground()的东西,还是一种排队的方式?
编辑:
澄清:我正在自动化的终端进程不是我的应用程序的一部分,它是PuTTY
如果我把对SetForegroundWindow的调用换成BringWindowToTop,就会遇到一个类似的问题--尽管在这种情况下,只有第一个终端被带到了前面,其余的则停留在任何其他窗口之后。
编辑2:
以下是大卫的建议。声明:
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那个电话..。
SetWindowPos(ProcessInfo.MainWindowHandle,
HWND_TOP,
0, 0, 0, 0,
SetWindowPosFlags.NOMOVE Or
SetWindowPosFlags.NOSIZE Or
SetWindowPosFlags.NOACTIVATE)发布于 2014-03-17 16:18:07
显然,你想把这些窗户放在前面,而不是让它们成为前景窗口。这样做的方法是调用SetWindowPos传递HWND_TOP。您需要将SWP_NOMOVE | SWP_NOSIZE作为uFlags参数传递,因为您只想更改z顺序,而不是位置和大小。
每次调用SetWindowPos之后,调用SetForegroundWindow传递应用程序的主窗口句柄。
https://stackoverflow.com/questions/22459389
复制相似问题