1

私は別のプログラムでボックスを見つけてそれに焦点を合わせるプログラムを書きました。これが完了すると、キーが送信され、このボックスに保存されます。

FindwindowとFindwindowExを使用してボックスを検索していますが、少し問題があります。 ここに画像の説明を入力してください ウィンドウが最初のTPanelまでずっと同じであることに気付いた場合。その後、3Tpanelクラスがあります。3Tpanelクラスの後に、複数のTttgEditクラスがあります。

選択したいクラスをプログラムに教えるにはどうすればよいですか?これがこれまでの私のコードです。

デルケア

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は、画面を開閉するたびに変わるので、静的な数字としては使えません。どんな助けでも素晴らしいでしょう。

4

1 に答える 1

1

の下に2番目のTPanelが必要なようですTttgCenterPanel

これを行うために、最初のTPanelを見つけることができます(すでにこれを行っています)。その後、の子孫でありTttgCenterPanel、最初のTPanelの後に続くTPanelを見つけます。FindWindowEx`に渡す必要がありhwndChild5ます。hwndChildAfter of

' .... 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)

FindWindowExのMSDNドキュメントから:

hwndChildAfter [in、オプション]

タイプ:HWND

子ウィンドウへのハンドル。検索は、Zオーダーの次の子ウィンドウから始まります。子ウィンドウは、子孫ウィンドウだけでなく、hwndParentの直接の子ウィンドウである必要があります。

hwndChildAfterがNULLの場合、検索はhwndParentの最初の子ウィンドウから始まります。

このアプローチは、2番目のTPanelを見つけようとしている場合に機能します。それらが毎回ランダムな順序である場合、これは失敗します。

于 2013-01-14T18:51:27.287 に答える