2013-01-14 2 views
1

다른 프로그램에서 상자를 찾아서 포커스를 설정하는 프로그램을 작성했습니다. 이 작업이 완료되면 키를 보내고이 상자에 저장합니다.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, 그들은 화면이 닫히고 열릴 때마다 변경, 그래서 정적 숫자로 사용하지 못할 . 어떤 도움이라도 굉장합니다.

답변

2

두 번째 TPanel이 TttgCenterPanel 아래에있는 것처럼 보입니다.

이렇게하려면 첫 번째 TPanel (이미 수행 한 작업)을 찾은 다음 TttgCenterPanel의 자손 인 TPanel을 찾고 첫 번째 TPanel 뒤에옵니다. FindWindowEx에 hwndChildAfter ofhwndChild5을 전달해야합니다. MSDN documentation 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) 

:

유형 [선택에서]

hwndChildAfter : HWND

자식 창에 대한 핸들. 검색은 Z 순서로 다음 하위 창에서 시작됩니다. 하위 창은 하위 창뿐 아니라 hwndParent의 직접 하위 창이어야합니다.

hwndChildAfter가 NULL이면 hwndParent의 첫 번째 하위 창에서 검색을 시작합니다.

두 번째 TPanel을 찾으려는 경우이 방법이 효과적입니다. 그들이 매번 무작위 순서에 있다면, 이것은 실패 할 것입니다.

+0

늦게 늦어서 죄송합니다. 이것은 자리에있었습니다. 고맙습니다 – user1946138

관련 문제