2012-07-01 2 views
5

Я хочу определить, показывает ли другой процесс process.exe в настоящее время диалоговое окно? Есть ли способ сделать это в C#?Обнаружение модального диалогового окна другого процесса

Чтобы узнать, могу ли я получить дескриптор диалогового окна. Я пробовал инструмент поиска Spy ++, когда я пытаюсь перетащить искатель поверх диалогового окна, он не выделяет диалоговое окно, но заполняет детали, а упоминает AppCustomDialogBox и упоминает номер дескриптора

Пожалуйста, сообщите, как можно обнаружить, что программно ..

Спасибо,

ответ

2

Как модальные диалоговые окна обычно отключить родительское окно (ы), вы можете перечислить все окна верхних уровня для процесса и посмотреть, если они включаются с помощью функции IsWindowEnabled().

+0

Спасибо, было полезно сузить пространство поиска, на самом деле у приложения было много скрытого верхнего уровня окна, но это сработало для меня с небольшой настройкой, – Ahmed

2

Когда приложение показывает диалоговое окно, то (для меня тихо раздражает) поведение операционной системы Windows, чтобы показать вновь созданный окно поверх всех остальных. Так что, если я предполагаю, что Вы знаете, какой процесс смотреть, способ обнаружить новое окно, чтобы создать окна крюка:

delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, 
    IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime); 

    [DllImport("user32.dll")] 
    public static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr 
     hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, 
     uint idThread, uint dwFlags); 

    [DllImport("user32.dll")] 
    public static extern bool UnhookWinEvent(IntPtr hWinEventHook); 

    // Constants from winuser.h 
    public const uint EVENT_SYSTEM_FOREGROUND = 3; 
    public const uint WINEVENT_OUTOFCONTEXT = 0; 

    //The GetForegroundWindow function returns a handle to the foreground window. 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetForegroundWindow(); 
    // For example, in Main() function 
    // Listen for foreground window changes across all processes/threads on current desktop 
    IntPtr hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, 
      new WinEventDelegate(WinEventProc), 0, 0, WINEVENT_OUTOFCONTEXT); 


    void WinEventProc(IntPtr hWinEventHook, uint eventType, 
    IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 
    {  
      IntPtr foregroundWinHandle = GetForegroundWindow(); 
      //Do something (f.e check if that is the needed window) 
    } 

    //When you Close Your application, remove the hook: 
    UnhookWinEvent(hhook); 

Я не пытался этот кодом явно для диалоговых окон, но и для отдельных процессов работает хорошо. Пожалуйста, помните, что этот код не может работать в службе Windows или в консольном приложении, поскольку для этого требуется message pump (у приложений Windows это есть). Вам нужно будет создать собственный.

Надеется, что это помогает

+0

Жизнь моего приложения не начинается до появления диалогов, поэтому подключение к новым диалогам не поможет .. – Ahmed

Смежные вопросы