2009-12-09 10 views
3

다른 응용 프로그램의 텍스트 상자에서 텍스트를 검색하고 싶습니다. 두 번째 응용 프로그램의 ProcessName은 'TestTextBox'이고 TextBox의 이름은 'textBox1'입니다. 빈 문자열을 반환다른 응용 프로그램에서 텍스트 가져 오기

내 코드 :

[DllImport("user32.dll")] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, long wParam, [MarshalAs(UnmanagedType.LPStr)] StringBuilder lParam); 

Process[] processes = Process.GetProcessesByName("TestTextBox"); 
foreach (Process p in processes) 
{ 
    IntPtr pFoundWindow = p.MainWindowHandle; 
    const int WM_GETTEXT = 0x0D; 
    StringBuilder sb = new StringBuilder(); 
    IntPtr retVal = SendMessage(pFoundWindow, WM_GETTEXT, 100, sb); 
    MessageBox.Show(sb.ToString()); 
} 
+0

LINQ는 여전히 내 할 일 목록에 있습니다 ... 또한 LINQ는 .NET 3.5 이상에서만 작동합니다. 그러나이 코드는 .NET 2.0 사용자를 포함하여 모든 종류의 Windows에서 작동해야합니다. – sventevit

+0

LINQ를 사용하여 어떻게 최적화 하시겠습니까? – Grzenio

+0

'Process.GetProcesses(). Any (p => p.ProcessName.Contains (processName)); 또는 그 행에있는 어떤 것. 그리고 아, .NET 2를 사용하고 있다는 것을 깨닫지 못했습니다! –

답변

1

폼에 gettext에 메시지 제목을 반환해야 MSDN에 따르면, 당신이 게시 코드의 주요 양식의 WindowHandle을 얻고있다. TextBox에서 텍스트를 가져 오려면 TextBox의 WindowHandle을 첫 번째 인수로 전달해야합니다.

+0

TextBox의 WindowsHandle을 얻으려면 어떻게해야합니까? – sventevit

+1

Doc Brown의 코멘트가 도움이 될 것입니다. 아마도 자식 창을 열거하고 텍스트를 가져 오려는 TextBox를 식별하는 방법을 찾아야 할 것입니다. –

3

"다른 응용 프로그램"이란 무엇입니까? 그것은 당신이 쓰고있는 것입니까? 다른 컴퓨터에서 실행 중일 수 있습니까? 다른 도메인에 있습니까? 다른 사용자 계정 아래에 있습니까? 대상 응용 프로그램, 양식 또는 텍스트 상자가 변경 될 수 있습니까? 애플리케이션간에 비동기 (즉, 비 차단) 통신이 필요합니까?

해당 질문에 대한 대답이 "예"이면 .Net Remoting을 고려해야합니다. 이것은 .Net 2.0에서 사용할 수 있습니다.

+0

필자는 아직이 응용 프로그램을 보지 못했지만 파이썬 등으로 작성 될 수도 있습니다. .Net Remoting을 언급 해 주셔서 감사합니다. – sventevit

0

다른 사람들이 언급 한 것처럼 Windows API를 사용할 수도 있고 AutoIt과 같은 라이브러리를 사용하면 작업을 좀 더 쉽게 할 수 있습니다. 요구 사항이 무엇인지 잘 모릅니다.

+0

Doc Brown의 링크를 통해 나는 그것을 작동하게 만들었습니다. 어쨌든 고마워요. AutoIt은 내가 찾고있는 것이 아닙니다. :) – sventevit

관련 문제