2013-04-15 2 views
0

우리는 배치로 실행해야하는 타사 winforms 소프트웨어가 있습니다. 특정 프로세스 (동시에 여러 프로세스를 실행)에 대한 특정 양식이 표시되는지 모니터링해야합니다.다른 프로세스 창 수신

나는 모든 창을 얻기 위해이 방법을 사용 하였다는 과정을 그리고

public IEnumerable<int> EnumerateProcessWindowHandles(int processId) 
{ 
    var handles = new List<IntPtr>(); 
    try 
    { 

     foreach (ProcessThread thread in Process.GetProcessById(processId).Threads) 
      Win32.EnumThreadWindows(thread.Id, 
       (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero); 

    } 
    catch(Exception e) {} 
    return handles.Select(h => (int)h); 
} 

초 제가 ​​위에서와 과정을 폴링 HWND를

public string GetTitle(int hwnd) 
{ 
    int length = Win32.SendMessage((IntPtr)hwnd, Win32.WM_GETTEXTLENGTH, 0, IntPtr.Zero); 
    var sb = new StringBuilder(length + 1); 
    Win32.SendMessage((IntPtr)hwnd, Win32.WM_GETTEXT, (IntPtr)sb.Capacity, sb); 
    return sb.ToString(); 
} 

각을에서 윈도우의 캡션을 얻기 위해이 방법에 대한 처리 메서드를 사용하지만 때로는 표시된 창을 검색하지 못합니다. 문제의 창은 1 초 이상 열리므로 폴 주파수가 아닙니다.

창이 닫히거나 열렸을 때 콜백을받을 수있는 확실한 방법이 있습니까?

답변

1

아마도 윈도우 생성 및 제거를 청취하는 가장 좋은 방법은 CBT hook을 사용하는 것입니다. HCBT_CREATEWNDHCBT_DESTROYWND을 들어보십시오. 이 MSDN 기사 인 Windows Hooks in the .NET Framework은 .net 관점에서 주제를 다루고 있습니다.

[1] http://spradip.wordpress.com/category/programming-c/page/2/

도움이 될 수 어쩌면

+0

감사합니다, 그것은 ThreadId 걸리는이

[2], 어떻게 내가 할 수있는 내가 사용하는 GUI 스레드를 보장 하시겠습니까? – Anders

+0

이해가 안됩니다. 당신은 정교 할 수 있습니까? –

관련 문제