Когда приложение показывает диалоговое окно, то (для меня тихо раздражает) поведение операционной системы 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 это есть). Вам нужно будет создать собственный.
Надеется, что это помогает
Спасибо, было полезно сузить пространство поиска, на самом деле у приложения было много скрытого верхнего уровня окна, но это сработало для меня с небольшой настройкой, – Ahmed