FindWindow FindWindowEx

时间:2013-01-14 18:33:10

标签: vb.net findwindow findwindowex

我编写了一个程序,用于在另一个程序中找到一个框并将焦点设置到它。完成后,它将发送密钥并保存到此框中。

我正在使用Findwindow和FindwindowEx找到该框,但我有点问题。 enter image description here 如果你注意到窗口一直到第一个TPanel都是一样的。此后,有3Tpanel类。 在3Tpanel类之后,有多个TttgEdit类。

如何教程序我想选择哪些类? 这是我到目前为止的代码。

Delcare

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As IntPtr) As Long

Private Declare Auto Function FindWindow Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As IntPtr

Private Declare Auto Function FindWindowEx Lib "user32.dll" ( _
ByVal hwndParent As IntPtr, _
ByVal hwndChildAfter As IntPtr, _
ByVal lpszClass As String, _
ByVal lpszWindow As String _
) As IntPtr

来源

    Dim hWnd As IntPtr = FindWindow("TRunprgForm", Nothing)
    If hWnd.Equals(IntPtr.Zero) Then
        Return
    End If
    cb1.Checked = True
    '--------------------instert here
    Dim hWndChild1 As IntPtr = _
    FindWindowEx(hWnd, IntPtr.Zero, "TmisinvForm", Nothing)
    If hWndChild1.Equals(IntPtr.Zero) Then
        Return
    End If

    Dim hWndChild2 As IntPtr = _
    FindWindowEx(hWndChild1, IntPtr.Zero, "TScrollBox", Nothing)
    If hWndChild2.Equals(IntPtr.Zero) Then
        Return
    End If

    Dim hWndChild3 As IntPtr = _
    FindWindowEx(hWndChild2, IntPtr.Zero, "TPageControl", Nothing)
    If hWndChild3.Equals(IntPtr.Zero) Then
        Return
    End If

    Dim hWndChild4 As IntPtr = _
    FindWindowEx(hWndChild3, IntPtr.Zero, "TTabSheet", Nothing)
    If hWndChild4.Equals(IntPtr.Zero) Then
        Return
    End If

    Dim hWndChild5 As IntPtr = _
    FindWindowEx(hWndChild4, IntPtr.Zero, "TttgCenterPanel", Nothing)
    If hWndChild5.Equals(IntPtr.Zero) Then
        Return
    End If

    Dim hWndChild6 As IntPtr = _
    FindWindowEx(hWndChild5, IntPtr.Zero, "TPanel", Nothing)
    If hWndChild6.Equals(IntPtr.Zero) Then
        Return
    End If

    Dim hWndEdit As IntPtr = _
    FindWindowEx(hWndChild6, IntPtr.Zero, "TttgDBEdit", Nothing)
    If hWndEdit.Equals(IntPtr.Zero) Then
        Return
    End If

    SetForegroundWindow(hWndEdit)

左侧的数字,hWnd,每次屏幕关闭和打开时它们都会改变,所以我不能将它们用作静态数字。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:2)

看起来你想要TttgCenterPanel下的第二个TPanel。

为了做到这一点,你可以找到第一个TPanel(你已经这样做了),然后找到TPanel,它是TttgCenterPanel的后代,并且位于第一个TPanel之后。您需要将hwndChild5传递到hwndChildAfter of FindWindowEx`。

' .... all the stuff you did before

Dim hWndChild5 As IntPtr = _
FindWindowEx(hWndChild4, IntPtr.Zero, "TttgCenterPanel", Nothing)
If hWndChild5.Equals(IntPtr.Zero) Then
    Return
End If

Dim hWndChild6 As IntPtr = _
FindWindowEx(hWndChild5, IntPtr.Zero, "TPanel", Nothing)
If hWndChild6.Equals(IntPtr.Zero) Then
    Return
End If

Dim hWndChild6Second As IntPtr = _
FindWindowEx(hWndChild5, hWndChild6, "TPanel", Nothing)
If hWndChild6Second.Equals(IntPtr.Zero) Then
    Return
End If

Dim hWndEdit As IntPtr = _
FindWindowEx(hWndChild6Second, IntPtr.Zero, "TttgDBEdit", Nothing)
If hWndEdit.Equals(IntPtr.Zero) Then
    Return
End If

SetForegroundWindow(hWndEdit)

来自MSDN documentation of FindWindowEx

  

hwndChildAfter [in,optional]

     

类型:HWND

     

子窗口的句柄。 搜索从Z顺序中的下一个子窗口开始。子窗口必须是hwndParent的直接子窗口,而不仅仅是后代窗口。

     

如果hwndChildAfter为NULL,则搜索从hwndParent的第一个子窗口开始。

如果您尝试查找第二个TPanel,此方法将起作用。如果它们每次都是随机顺序,则会失败。