Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Sustituir el Menú de Inicio de Windows (https://www.clubdelphi.com/foros/showthread.php?t=29428)

Jonnathan 21-01-2006 07:30:57

Sustituir el Menú de Inicio de Windows
 
Buen día amantes de Delphi, estoy haciendo una aplicación que se ejecuta en pantalla completa y me gustaria sustituir el Menu de Inicio de Windows con un menu personalizado. ¿Alguien sabe como interceptar el evento o mensaje que se envía cuando se presiona la tecla de windows de un teclado M$ o cuando aparece el menu de inicio de Windows? :confused:

jmariano 21-01-2006 14:50:35

Bueno, después de buscar por ahí encontré el código siguiente que puede serte de ayuda:

Para ocultar el menú (o botón) de inicio:
Código Delphi [-]
var
  h : hwnd;
begin
  h := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil);
  ShowWindow(h, 0);
  Windows.SetParent(h, 0);
end;

Para volver a restablecerlo:
Código Delphi [-]
var
  h : hwnd;
  TaskWindow: hwnd;
begin
  h := FindWindowEx(Getdesktopwindow, 0, 'Button', nil);
  TaskWindow := FindWindow('Shell_TrayWnd', nil);
  Windows.SetParent(h, TaskWindow);
  ShowWindow(h, 1);
end;

Para sustituirlo por uno propio:
Código Delphi [-]
var
  b: TButton; // u otro tipo de Botón que puede contener un Bitmap
  h: hwnd;
begin
  h := FindWindow('Shell_TrayWnd', nil);
  b := TButton.Create(nil);
  b.ParentWindow := h;
  b.Caption := 'Inicio';
  b.Width := 60;
  b.font.style := [fsbold];
end;

(Verás que el secreto está en capturar la ventana de sistema "Shell_TrayWnd", que representa la barra de inicio).

Saludos!

Jonnathan 23-01-2006 05:24:50

Capturando mensajes?
 
Buen dia amigo, gracias por tu respuesta, ya habia visto esa solución en otro hilo y tiene un problema que pude probar yo mismo: En Windows XP (No se si en 9x y 2K) aunque ocultes o desactives la barra y el boton de inicio, el menu aparece al presionar la tecla Windows o Ctrl+Esc. Incluso hace un tiempo hice un programa que listaba los controles y ventanas que estaban en el escritorio y con él hice la prueba, pero nada, igual sigue apareciendo el menu :( .
Se me habia ocurrido que tal vez se podia capturar algun mensaje específico de sistema con el componente ApplicationEvents o algun Hook que capture cuando se presiona la tecla Windows pero no soy muy bueno con eso. Alguien sabe como se podría implementar? Ah otra cosa, si capturo un hook del evento cuando se presiona una tecla mi aplicación podría capturarla antes que vaya a cualquier otra aplicación?, procesarla y desactivarla? asi como un evento "OnKeyPress" en un TEdit cuando hacemos "Key:=0". Recuerdo haber visto eso una vez en un programa, sobre todo en los programas que bloquean los computadores en los cybercafes. Agradecería su ayuda gurús de Delphi :( .

roman 23-01-2006 06:05:08

En la sección de ejemplos de mi página podrás encontrar uno para desactivar algunas teclas del sistema, entre ellas la tecla Win y la combinación Crl+Esc. Mira a ver si te sirve.

// Saludos

jmariano 23-01-2006 11:31:57

Además de lo comentado por roman, si te fijas en el código que puse para desactivar el menú de inicio verás que, además de "ocultar" el botón, también se cambia el "padre" de éste asignándole uno "nulo", por lo que todas las pulsaciones de teclas que muestran el menú (Ctrl-Esc y la tecla de Windows) quedan deshabilitadas. (Haz la prueba y verás que el menú no aparece aunque se pulsen dichas teclas, lo único que ocurre es que el formulario activo de nuestra aplicación pierde el foco, al menos a mi me funciona).

Saludos!

roman 23-01-2006 15:38:13

Me base en lo que decía Jonnathan acerca de que de cualquier forma aparecía el menú, pero tienes razón, se deshabilita por completo.

// Saludos

Jonnathan 23-01-2006 16:01:34

Disculpa jmariano, tenias toda la razón, la línea que cambia el "padre" al botón de Windows era lo que faltaba, ahora si oculta y desactiva totalmente el menu de Windows. Ahora solo me falta capturar cuando se presiona la tecla de Windows y mostrar mi propio menú, voy a echar un vistazo al ejemplo de roman que aparece en su blog para probar. Gracias por su ayuda maestros de delphi :D .

roman 23-01-2006 16:06:16

Cita:

Empezado por Jonnathan
voy a echar un vistazo al ejemplo de roman que aparece en su blog para probar

Je, je, nada más aclarar que, contrario a las modas y tendencias actuales, lo mío no es un blog. :)

// Saludos

Jonnathan 23-01-2006 19:48:38

Detectar cuando la tecla de Windows es liberada
 
Disculpas a los afectados por mi comentario del blog :rolleyes: . El código del hook que está en tu página esta excelente roman, solo hace falta levantar el Hook al inicio de la aplicación y quitarlo al cerrar. Lo use combinado con el método de jmariano para desactivar el botón y ya puedo mostrar mi menú personalizado. Solo una cosa más, puse una linea para mandar a mostrar mi menú al comprobar que la tecla presionada era la tecla de Windows y que desaparezca el menú si la presiono de nuevo, pero cuando dejo presionada la tecla el menu parpadea apareciendo y desapareciendo. Me puse a buscar código por internet y encontre que dentro de la estructura TKbdHookInfo hay una variable "Flags" la cual retorna valores adicionales sobre el evento en cuestión, asi que declare algunas banderas adicionales que vi por ahi:

Código Delphi [-]
  //Flags adicionales
  LLKHF_EXTENDED = $1;    //Funcion extendida?
  LLKHF_UP = $80;          //Indica si la tecla es liberada

Asi que el código para que salga el menú solo cuando liberas la tecla de Windows dentro del hook lo deje asi:

Código Delphi [-]
    var 
       VkCode: DWORD;
       Flags: DWORD;
    ...
    begin
    VkCode := PKbdHookInfo(LParam).VkCode;
    Flags:= PKbdHookInfo(LParam).Flags;
    ...
    if ((VkCode = VK_LWIN) or (VkCode = VK_RWIN)) and (lkWin in Keys) then
    begin
      Result := 1;
      if Flags = LLKHF_UP + LLKHF_EXTENDED then
         OnWindowsKey(); //Funcion que hace aparecer mi menu
      exit;
    end;
    ...
    end;

Para el caso de la combinación Ctrl+Esc creo que esta un poco más dificil ese detalle, pero bueno, si la gente de Microsoft no le preocupo hacer esa validación, pues yo menos (el que quiera saber a que me refiero que mantenga presionada la combinación Ctrl+Esc un momento) :p. Muchas gracias chicos por la ayuda que me han dado, un saludo desde Venezuela.


La franja horaria es GMT +2. Ahora son las 16:24:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi