Por lo tanto, pensé que esto sería simple y, además, estaba equivocado. Aquí hay una descripción simplificada del problema:Como encontrar de forma fiable la ventana en primer plano cuando no tiene el foco
Estoy escribiendo una pequeña aplicación para nuestra gente de fabricación que tomará una captura de pantalla de todo el escritorio, así como la ventana de primer plano cuando hagan clic en el icono de la aplicación en la bandeja del sistema. Actualmente, estoy usando el método Win32 "GetforegroundWindow" en el evento MouseMove de NotifyIcon para guardar el identificador de ventana de primer plano y tomar la captura de pantalla en el evento Click.
Esto funciona a veces, pero si hago clic en el icono muy rápidamente que realmente captura la barra de tareas en lugar de la ventana en primer plano. No estoy seguro de por qué sucede esto (entiendo que la barra de tareas sea una ventana, no entiendo por qué a veces parece tener foco en MouseMove antes de hacer clic), y he tenido poca suerte usando el método EnumWindows también, probablemente porque no entiendo completamente cómo funciona.
Parecería que, si yo fuera capaz de obtener la posición z de cada ventana utilizando sólo el identificador de ventana, esto sería un problema fácil de resolver utilizando EnumWindows. Sin embargo, no he encontrado un método para hacerlo.
Por lo tanto, pido a ustedes; ¿Cómo escribirías un método para ubicar la ventana de primer plano de manera confiable, dado que puede no tener foco en ese momento? O mi google-fu me está fallando o la información sobre esto es escasa. Gracias por adelantado.
Correcto, entiendo que la barra de tareas es una ventana, pero eso es exactamente lo que estoy tratando de evitar. Necesito obtener el hWnd de la ventana lógica en primer plano. Intentaré pasar HWND_NEXT y ver si eso siempre me devuelve lo que busco. Gracias. –
Por supuesto, ahora necesito poder encontrar el controlador en la barra de tareas = P.eso probablemente se definió en algún lugar para mí, miraré (sé que el escritorio es 0). –
Bueno, en realidad ya tienes el mango en ese punto. Solo necesita usar GetClassName para determinar si ese identificador es la barra de tareas o no. Si tiene instalado Spy ++, puede usarlo para encontrar el nombre de la clase. No lo sé de mano. http://msdn.microsoft.com/en-us/library/ms633582(VS.85).aspx – Josh