2011-02-02 23 views
5

Así que sí, me encuentro en la dudosa posición de implementar una llamada SwitchToThisWindow para forzar mi ventana al frente. Estoy de acuerdo, no es ideal, pero no siempre es posible argumentar en contra de las "características" del producto que otros consideran necesarias.SwitchToThisWindow envía la ventana actual a la parte posterior

Ahora, considero SwitchToThisWindow ser una victoria sobre el AttachThreadInput truco para hacer un interruptor de la ventana forzada como su menor probabilidad a un punto muerto, y debe ser eliminado SwitchToThisWindow, o dejan de funcionar, no me quejaré.

Sin embargo, SwitchToThisWindow tiene el desafortunado efecto secundario de empujar la ventana de primer plano actual al final del orden z además de llevar la ventana de destino a la parte superior cuando se pasa FALSE para el parámetro fAltTab, y no hacer nada si TRUE se pasa.

¿Cómo puedo evitar este comportamiento 'push current active to z-bottom' sin recurrir a AttachThreadInput?

Alternativamente, MS puede simplemente eliminar AttachThreadInput como una solución viable y puedo decirle a mi gerente que lo imposible, de hecho, es realmente imposible.

+0

Supongo que no puede simplemente usar ['SetForegroundWindow'] (http://msdn.microsoft.com/en-us/library/ms633539.aspx)? No está claro exactamente qué característica del producto necesita implementar, excepto para traer una ventana al frente. 'SetForegroundWindow' incluso funciona para ventanas que están conectadas a otro hilo que el que está actualmente, pero sí requiere que su aplicación esté actualmente en primer plano. No puedo decir si eso es un problema aquí. –

+0

Ese es el problema: pasar al primer plano incluso cuando el usuario tiene una aplicación diferente activa. –

+1

Ya veo. Quieres ser una de * esas * aplicaciones. No es de extrañar que describa su posición como "no ideal". ¿No hay margen de maniobra para hacer las cosas de la manera "correcta" y mostrar un ícono de notificación o un deslizador de brindis? Muéstrele a su jefe: "[Los programas bien diseñados usan el área de notificación de forma apropiada, sin ser molestos o molestos.] (Http://msdn.microsoft.com/en-us/library/aa511448.aspx)" :-) –

Respuesta

5

No sé si esto ayuda, pero la única manera que he encontrado para llevar a cabo mi ventana arriba fiable es hacer las siguientes 2 llamadas:

ShowWindow(myhwnd, SW_MINIMIZE); 
ShowWindow(myhwnd, SW_RESTORE); 

Obviamente estas llamadas sólo se deben hacer, cuando su ventana actualmente no es la más alta para evitar el parpadeo. Pero esto tampoco debería tener el efecto secundario de llevar la ventana delantera actual al final del orden z.

+0

Se siente un poco hackish, pero creo que esto podría funcionar ... –

+0

El hecho de que esto funcione es un error importante de Windows , ¡buen descubrimiento! – Anders

2

Al pasar fAltTab=FALSE, en realidad está emulando Alt + Esc. Por lo tanto, puede revertir este cambio de orden z con SetWindowPos y su hWndInsertAfter después de la llamada SwitchToThisWindow, pero luego está de vuelta en feo hacky-land en mi humilde opinión.

La pregunta es, ¿realmente necesitas el foco del teclado?

Permítanme sugerir otra alternativa:

  1. Si se minimiza la ventana, restaurarlo
  2. Fija tu ventana a ser más alta, cuando la ventana se activa quitar el estilo nuevo.
  3. llamada SetForegroundWindow a parpadear el botón de la barra de tareas (O FlashWindowEx)

Esto debe evitar el escenario donde un usuario está escribiendo y termina de realizar algún tipo de acción en la interfaz de usuario sin ni siquiera mirar a la pantalla.

Editar:

HWND hwndFgnd=GetForegroundWindow(); 
SetWindowPos(hwnd,hwndFgnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE); 
SetWindowPos(hwndFgnd,hwnd,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 

..will es probable que funcione si no desea establecer el bit más alta en cualquier punto (Incluso si la ventana está en la parte superior de la orden z, se todavía no puede obtener legalmente el foco con SetForegroundWindow)

0

Este es un mal problema que enfrenté también. Ver mi solución here. Funciona tanto para Show() como para ShowDialog().

Cuestiones relacionadas