Tengo un proyecto Delphi 2007 que ha funcionado bien en Windos XP, Vista y "7" durante años. Fue una actualización de Delphi 5 por lo que "MainFormOnTaskBar" era "falso" por defecto (nunca lo cambié en DPR). En este escenario, la tecla de acceso directo del sistema funcionó "en todo el sistema" con el siguiente código en el controlador de eventos OnCreate de la forma principal.Delphi 2007 - La tecla de acceso directo del sistema NO es "todo el sistema" si establece "MainFormOnTaskBar: = True"
HotKey_xyz := GlobalAddAtom('Hotkey_xyz');
if NOT RegisterHotKey(Self.Handle, HotKey_xyz, MOD_CONTROL, VK_F12) then
ShowMessage('Unable to register Control-F12 as system-wide hot key') ;
(I have GlobalDeleteAtom() and UnregisterHotKey() in Form.OnDestroy as expected.)
Ahora, necesito un formulario para mostrar su propio botón en la barra de tareas, así que me puse "Application.MainFormOnTaskBar: = True" en la RPD. Esto funciona como se esperaba Sin embargo, esto tiene el efecto secundario de que Control-F12 NO funciona en todo el sistema, funciona SÓLO SI mi aplicación tiene foco (por lo tanto, NO es "todo el sistema")
He buscado mucho en 'Net ha encontrado muchos artículos sobre cómo/por qué' MainFormOnTaskBar 'afecta a ciertos comportamientos de formularios subformulares/modales. Sin embargo, no he encontrado nada con respecto a su efecto en una cuestión de "Acceso directo a todo el sistema" que describo más arriba. He probado y vuelto a probar mi aplicación con MainFormOnTaskBar establecido en verdadero y falso, mientras que todo lo demás permanece exactamente igual. Puedo verificar positivamente que el problema descrito anteriormente con la tecla de acceso directo en todo el sistema se relaciona con el indicador MainFormOnTaskBar.
Agradeceré cualquier orientación con respecto a una solución temporal. Necesito TANTO: una tecla de acceso directo del sistema Y un formulario con su propio botón en la barra de tareas.
Muchas gracias.
¿Se puede duplicar con un * nuevo * proyecto? No pude ... –
No puedo reproducir esto tampoco. ¿Puedes publicar más código? (Y posiblemente intente cambiar 'Self.Handle' por' Application.Handle' en la llamada 'RegisterHotkey' mientras tanto} El mensaje' WM_HOTKEY' seguirá llegando a su formulario, porque el manejador de mensajes de la aplicación no hace nada con eso ; se enviará a su formulario como siempre). –
@KenWhite: si se utiliza 'Application.Handle' para registrar la tecla de acceso rápido, los mensajes' WM_HOTKEY' NO se enviarán directamente o indirectamente al TForm. Serán dirigidos a 'TApplication' en su lugar, por lo que para capturar esos mensajes debe usar el evento' TApplication.OnMessage' y/o el método 'TApplication.HookMainWindow()'. –