首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FindWindow FindWindowEx

FindWindow FindWindowEx
EN

Stack Overflow用户
提问于 2013-01-15 02:33:10
回答 1查看 30.6K关注 0票数 1

我已经写了一个程序,在另一个程序中找到一个盒子,并将焦点放在它上面。一旦完成此操作,它将发送密钥并保存到此框中。

我正在使用Findwindow和FindwindowEx来定位这个盒子,但是我有一个小问题。

如果你注意到窗口一直到第一个TPanel都是一样的。现在,在那之后还有3Tpanel类。在3Tpanel类之后有多个TttgEdit类。

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

Delcare

代码语言:javascript
复制
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

来源

代码语言:javascript
复制
    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,它们在每次屏幕关闭和打开时都会改变,所以我不能将它们用作静态数字。任何帮助都是很棒的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-15 02:51:27

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

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

代码语言:javascript
复制
' .... 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,可选

类型: HWND

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

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

如果您正在尝试查找第二个TPanel,则此方法将起作用。如果它们每次都是随机排列的,这将失败。

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

https://stackoverflow.com/questions/14324403

复制
相关文章

相似问题

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