2012-10-07 5 views
0

다른 창에서 텍스트 값을 읽고 그 값을 다른 응용 프로그램에 쿼리해야합니다. (제 질문은 첫 번째 태스크와 관련됩니다) ... so, 다른 창을 감시하고 있습니다. 당사 제품과 관련하여 사용하는 당사자 응용 프로그램)을 선택하고 텍스트 상자에서 값을 읽으려면 "승인"단추를 클릭하기를 기다립니다. 이 다른 응용 프로그램 인 대화 상자에는 여러 텍스트 상자와 명령 단추가 있습니다. 마우스 훅을 만들었으므로이 애플리케이션이 나타나면 활성화 할 것입니다. 이 창 직사각형 안의 모든 마우스 움직임을 읽습니다. 텍스트, 자막, 자식 창 ID, 직사각형, 왼쪽/오른쪽/중간/휠 클릭을 가져옵니다. "동의 함"버튼을 클릭 할 수 있습니다. 버튼 캡션을 볼 수 있고 그 창을 읽을 수 있고, 텍스트를 가져 와서 어떤 버튼이 클릭되었는지 확인할 수 있습니다. 이제 ... 모든 편집 클래스 값을 읽을 수 있고, 창 핸들, 사각형 등을 얻을 수 있지만, ID를 식별 할 수는 없습니다. 클래스 컬렉션 내에서 고유 한 항목으로 : 원하는 텍스트 상자 값을 구체적으로 읽어야합니다. 다행히 EDIT 클래스 루프에서 텍스트를 읽을 때 관심있는 텍스트 상자가 항상 내 루프에옵니다. 그러나 나는 더 구체적이되고 싶다; NAME이라는 텍스트 상자를 읽고 있는지 확인하십시오. 알아. 개발 과정에서 그 NAME을 읽고 프로그램에서 하드 코딩 할 수있었습니다. 내 이름은 제어 이름이 바이너리 코드에 저장되지 않는다는 것이다. 내 이해 제어 ID입니다, Windows 처리 창 생성시 만들어지며 절대 제어 이름 (말 : txtOrderNumber)에 대한 참조가 있습니다. 버튼의 경우 버튼 캡션 때문에 특정 될 수 있습니다 (어떤 버튼이 클릭되었는지 확인할 수 있음). EDIT 클래스 항목으로 잠겨있어 값을 읽을 때 운 좋은 첫 번째 추측에 던졌습니다. 내 질문 : 다른 창에서 컨트롤 이름을 어떻게 얻을 수 있습니까?이 작업을 위해 EDIT 클래스 인스턴스 이름에 대해 알고 싶습니다. 를 IntPtr =를 FindWindow로다른 창에서 제어 이름

희미한 HWND (아무것도 _windowText)

'API : FindWindowEx 'API : sendMessage 첨부 'API : GetClassSignature의 'API : GetWindowTextLength 다음은 프로젝트 (단축) 일부 코드입니다 'API : et Wi ndow Te xt는 'API : WM_GETTEXT

Public Shared Function GetClassValues(_controlClass As String, _hWindow As IntPtr) As List(Of String) 

    Dim cl As New List(Of String) 

    'First control handle in that class 
    Dim hc As IntPtr = FindWindowEx(_hWindow, IntPtr.Zero, _controlClass, vbNullString) 
    Do 
     Dim sv As String = GetWindowValue(hc) 
     cl.Add(sv) 

     'Next control (after hc) handle 
     hc = FindWindowEx(_hWindow, hc, _controlClass, vbNullString) 
    Loop Until hc = 0 
    Return cl 
End Function 
Public Shared Function GetWindowValue(_hWindow As IntPtr) As String 
    If _hWindow = IntPtr.Zero Then Return String.Empty 
    Dim sz As Integer = 256 
    Dim bf As IntPtr = Marshal.AllocHGlobal(sz) 
    Dim pt As IntPtr = SendMessage(_hWindow, WM_GETTEXT, sz, bf) 
    Dim rs As String = Marshal.PtrToStringUni(bf) 
    Marshal.Release(bf) 
    Return rs.Trim 
End Function 
Public Shared Function GetWindowClassName(_hWindow As IntPtr) As String 
    Dim ln As Integer = 256 
    Dim sb As New System.Text.StringBuilder("", ln) 
    GetClassName(_hWindow, sb, ln) 
    Return sb.ToString() 
End Function 
Public Shared Function GetWindowText(_hWindow As IntPtr) As String 
    Dim ln As Integer 
    If _hWindow.ToInt32 <= 0 Then Return String.Empty 
    ln = GetWindowTextLength(_hWindow) 
    If ln = 0 Then Return String.Empty 
    Dim sb As New System.Text.StringBuilder("", ln + 1) 
    GetWindowText(_hWindow, sb, sb.Capacity) 
    Return sb.ToString() 
End Function 

나는를 GetWindowLong과 GetDlgCtrlID API 검토 한 결과 지금까지 성공하지 플래그의 대부분을 시도 ...

팁, 실마리, 방향이 좋습니다. 고맙습니다.

+0

GetWindowText와 WM_GETTEXT는 서로 다른 프로세스/프로그램에 속한 창의 텍스트를 검색 할 수 없습니다. 프로세스 자체에서 사용하는 경우에만 유효합니다. 따라서 전역 적 연결을 통해 간접적으로 해당 프로세스의 컨텍스트에서 사용할 필요가 있습니다. – Jay

+0

답글이 댓글에 적합하지 않습니다. 나는 메인 페이지에 그것을 게시했다. –

답변

0

전 세계적인 마우스 후크를 만들었습니다. 문제가되지 않으며 GetWindowText 및 WM_GETTEXT가 정상적으로 작동합니다. 사실이 프로그램은 현재 잘 작동하고 기능적입니다. 대상 창을 검색하면 EnumChildWindows API를 사용하여 목록 컬렉션에 자식 창 핸들을 저장하고 EDIT 클래스 창만 필터링합니다 (위에 게시 된 GetClassValues ​​함수의 수정 된 버전과 관련하여 사용됨).이 함수의 인수는 첫 번째 EDIT 클래스 창 핸들입니다. . 어쨌든, 내가 원하는 텍스트 상자에 임의로 액세스하는 방법은이 클래스 창에 대해 저장된 목록을 사용하고 목록 색인으로 액세스하는 것입니다. 앞에서 언급했듯이, 다행히 창은이 창 창을 일관된 순서로 만듭니다. 그래서, 제 경우에는이 EDIT 클래스 창, 텍스트 상자 "object"가 목록의 첫 번째 항목입니다. 메인 창에 많은 수가 있지만. 이전에 언급 한 것처럼 "txtAccountNumber"라는 텍스트 상자의 "object"이름을 얻고 싶습니다 ...