2012-07-01 9 views
5

quiero para detectar si otro proceso Process.exe decir está actualmente mostrando un cuadro de diálogo? ¿Hay alguna manera de hacerlo en C#?La detección de un cuadro de diálogo modal de otro proceso

Para ver si podía obtener el identificador del cuadro de diálogo. He intentado con la herramienta de ventana de búsqueda de Spy ++, cuando intento arrastrar el buscador sobre el cuadro de diálogo, no resalta el cuadro de diálogo pero rellena los detalles y menciona AppCustomDialogBox y menciona el número de identificador

Indique cómo puedo detectar que programáticamente ..

Gracias,

Respuesta

2

diálogos como modal normalmente desactivar la ventana (s) de los padres, puede enumerar todas las ventanas de nivel superior para un proceso y ver si están permitidos usando la función IsWindowEnabled().

+0

Gracias fue útil reducir mi espacio de búsqueda, la aplicación realmente tenía un alto nivel oculto Windows, pero funcionó para mí con un poco de ajuste, – Ahmed

2

Cuando una aplicación muestra un cuadro de diálogo, la (para mí en silencio molesto) el comportamiento del sistema operativo Windows es para mostrar la ventana de nueva creación en la parte superior de todas las demás. Así que si yo asuma que usted sabe lo que el proceso de ver, una manera de detectar una nueva ventana es la creación de un gancho de ventanas:

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); 

no lo probé ese código explícitamente para los cuadros de diálogo, pero para procesos separados que funciona bien. Recuerde que ese código no puede funcionar en un servicio de Windows o una aplicación de consola, ya que requiere un message pump (las aplicaciones de Windows lo tienen). Tendrás que crear uno propio.

Esperanza esto ayuda

+0

La vida útil de mi aplicación no comienza antes de que aparezcan los cuadros de diálogo, de modo que engancharme a nuevos cuadros de diálogo no ayudará ... – Ahmed

Cuestiones relacionadas