다른 창에서 텍스트 값을 읽고 그 값을 다른 응용 프로그램에 쿼리해야합니다. (제 질문은 첫 번째 태스크와 관련됩니다) ... 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 검토 한 결과 지금까지 성공하지 플래그의 대부분을 시도 ...
팁, 실마리, 방향이 좋습니다. 고맙습니다.
GetWindowText와 WM_GETTEXT는 서로 다른 프로세스/프로그램에 속한 창의 텍스트를 검색 할 수 없습니다. 프로세스 자체에서 사용하는 경우에만 유효합니다. 따라서 전역 적 연결을 통해 간접적으로 해당 프로세스의 컨텍스트에서 사용할 필요가 있습니다. – Jay
답글이 댓글에 적합하지 않습니다. 나는 메인 페이지에 그것을 게시했다. –