2011-08-28 26 views
15

Tengo que ocultar las ventanas emergentes en la biblioteca de terceros.Win32: Cómo ocultar ventanas de terceros en la barra de tareas por hWnd

Implementé Windows Hook con SetWindowsHookEx y conozco todos los hWnd (s) creados recientemente. Escucho HSHELL_WINDOWCREATED devolución de llamada y haga lo siguiente:

long style= GetWindowLong(hWnd, GWL_STYLE); 
style &= ~(WS_VISIBLE); // this works - window become invisible 

style |= WS_EX_TOOLWINDOW; // flags don't work - windows remains in taskbar 
style &= ~(WS_EX_APPWINDOW); 

SetWindowLong(hWnd, GWL_STYLE, style);  

lo que hago mal aquí para ocultar ventanas newely creados en la barra de tareas?

+1

WS_EX_ * debe ser get/set con GWL_EXSTYLE - no GWL_STYLE. (WS_EX_TOOLWINDOW tiene el valor 0x00000080, que si lo usa como un GWL_STYLE en lugar de un _EXSTYLE, terminará modificando la parte de un estilo de Windows que normalmente no se usa para las ventanas de la aplicación, por lo que parecerá que no se está ejecutando. La parte baja de un estilo de Windows normalmente se usa para bits de estilo específicos del control, por ejemplo, para un botón, este tiene el mismo valor que BS_BITMAP.) – BrendanMcK

Respuesta

20

Antes de utilizar SetWindowLong, llame ShowWindow(hWnd, SW_HIDE), a continuación, llamar SetWindowLong, a continuación, llamar de nuevo como ShowWindowShowWindow(hWnd, SW_SHOW). Así que el código se verá así:

long style= GetWindowLong(hWnd, GWL_STYLE); 
style &= ~(WS_VISIBLE); // this works - window become invisible 

style |= WS_EX_TOOLWINDOW; // flags don't work - windows remains in taskbar 
style &= ~(WS_EX_APPWINDOW); 

ShowWindow(hWnd, SW_HIDE); // hide the window 
SetWindowLong(hWnd, GWL_STYLE, style); // set the style 
ShowWindow(hWnd, SW_SHOW); // show the window for the new style to come into effect 
ShowWindow(hWnd, SW_HIDE); // hide the window so we can't see it 

Aquí es una cita relevante de Microsoft's Website:

Para evitar que el botón de la ventana por la inscripción en la barra de tareas, crear la ventana sin dueño con el WS_EX_TOOLWINDOW extendida estilo. Como una alternativa , puede crear una ventana oculta y hacer que esta ventana oculta sea la propietaria de su ventana visible.

El Shell eliminará el botón de una ventana de la barra de tareas solo si el estilo de la ventana admite los botones visibles de la barra de tareas. Si desea cambiar dinámicamente el estilo de una ventana a una que no admite botones de la barra de tareas visibles, primero debe ocultar la ventana (llamando al ShowWindow con SW_HIDE), cambiar el estilo de la ventana y mostrar la ventana .

+0

lo siento, no funciona para mí. Las ventanas que oculto previamente con éxito ahora aparecen visibles y se muestran en la barra de tareas. –

+0

@Andrew eso es muy raro. Puede que no funcione, pero por curiosidad, intente 'SetWindowLong' después de llamar a' ShowWindow (hWnd, SW_SHOW); 'también. Entonces el código iría a 'ShowWindow (hWnd, SW_HIDE); SetWindowLong (hWnd, GWL_STYLE, estilo); ShowWindow (hWnd, SW_SHOW); SetWindowLong (hWnd, GWL_STYLE, style); ' –

+0

@Andrew también ¿qué indicador está usando como primer parámetro para' SetWindowsHookEx'? –

0

Debe usar GWL_EXSTYLE para obtener/configurar las banderas EX, GWL_STYLE no funcionará para las banderas EX.

Cuestiones relacionadas