2010-06-17 15 views
5

Primero explicaré por qué lo necesito, porque anticipo que la primera respuesta será "¿Por qué lo necesita?". Quiero detectar cuando el cursor del mouse está en un borde de la pantalla y no quiero usar ganchos. Por lo tanto, creé una ventana invisible TOPMOST de un píxel de ancho.¿Cómo mantener mi ventana más alta en la parte superior?

estoy usando C++ en Windows XP, por lo que cuando se crea la ventana (CreateWindowEx (WS_EX_TOPMOST |. WS_EX_TRANSPARENT ...) todo funciona bien

Por desgracia, si un usuario se mueve otra ventana superior, por ejemplo, la barra de tareas por encima de mi ventana, que no entiendo los movimientos del ratón

traté de resolver este modo similar a los enfoques sugeridos en:. How To Keep an MDI Window Always on Top

me trató de comprobar si hay orden Z de mi ventana superior en WM_WINDOWPOSCHANGED primero con

pero pWP-> hwnd apunta a mi ventana y pWP-> hwndInsertAfter es 0, lo que significa que mi ventana está en la parte superior de la Z, aunque esté cubierta con la barra de tareas. Luego probé:

case WM_WINDOWPOSCHANGED : 
    HWND topWndHndl = GetNextWindow(myHandle, GW_HWNDPREV) 
    GetWindowText(topWndHndl, pszMem, cTxtLen + 1); 

y siempre a conseguir que la ventana "Default IME" está en la parte superior de la ventana. Incluso si tratas de llevar mi ventana a la cima con SetWindowPos() o BringWindowToTop(), "IME predeterminado" permanece en la parte superior. No sé qué es "IME predeterminado" y cómo detectar si la barra de tareas está en la parte superior de mi ventana.

Así que mi pregunta es: ¿Cómo detectar que mi ventana superior ya no es la ventana superior superior y cómo mantenerla en la parte superior?

P.S. Sé que un enfoque de "fuerza bruta" de llevar periódicamente mi ventana a los trabajos principales, es feo y podría tener alguna inferencia no deseada con la ventana de notificaciones, por ejemplo. (Llevar mi ventana a la parte superior ocultará la ventana de notificación.)

¡Gracias por su tiempo y sugerencias!

+0

posible duplicado de [¿Cómo hacer que una ventana permanezca siempre en la parte superior en .Net?] (Http://stackoverflow.com/questions/683330/how-to-make-a-window-always-stay-on- top-in-net) –

Respuesta

8

TopMost, siempre es algo complicado. No hay forma de anular otra ventana que se especifica como TopMost.

Raymond Chen has a good article on this.

también un duplicado de this.

+3

El artículo de Chen no es bueno. Yo como usuario quiero que solo un programa lo haga. Nunca comenzaré 2 de estos programas a la vez. Entonces, incluso si el Universo se colapsa cuando dos programas intentan ser el Topmostest simultáneamente, no me importa. – noober

Cuestiones relacionadas