FindWindow FindWindowEx

Posted

技术标签:

【中文标题】FindWindow FindWindowEx【英文标题】: 【发布时间】:2012-12-28 18:21:03 【问题描述】:

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

我正在使用 Findwindow 和 FindwindowEx 来定位该框,但我遇到了一些问题。 如果您注意到窗口一直到第一个 TPanel 都是相同的。现在之后有 3Tpanel 类。 在 3Tpanel Classes 之后有多个 TttgEdit Classes。

如何教授我想选择的课程? 到目前为止,这是我的代码。

德尔卡

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】:

您似乎想要TttgCenterPanel 下的第二个TPanel。

为了做到这一点,您可以找到第一个 TPanel(您已经这样做了),然后找到作为 TttgCenterPanel 的后代的 TPanel,并在第一个 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 [输入,可选]

类型:HWND

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

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

如果您尝试查找第二个 TPanel,此方法将有效。如果它们每次都是随机顺序,这将失败。

【讨论】:

以上是关于FindWindow FindWindowEx的主要内容,如果未能解决你的问题,请参考以下文章

FindWindow() 不工作

FindWindow() 失败,但 GetLastError 返回 0

::FindWindow 从服务应用程序失败

win32gui.FindWindow 找不到窗口

关于vb2005中用到的arp函数findwindow无法在user32.dll中找不到findwindowA接口

即使窗口存在,FindWindow 在 MASM32 程序中也返回零