¿Cómo detectar el clic derecho en un TMenuItem con WM_MENURBUTTONUP?
En una aplicación VCL Delphi 11 de 32 bits en Windows 10, utilizo un componente TApplicationEvents
para capturar mensajes de Windows. Desafortunadamente, TApplicationEvents
parece que no reacciona al mensaje WM_MENURBUTTONUP
cuando hago “clic-derecho” en un elemento de menú TPopupMenu
:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
case Msg.message of
Winapi.Messages.WM_MENURBUTTONUP: CodeSite.Send('TForm1.ApplicationEvents1Message: WM_MENURBUTTONUP');
end;
end;
La documentación de Microsoft (Microsoft documentation) dice:
Mensaje WM_MENURBUTTONUP
Se envía cuando el usuario suelta el botón derecho del mouse mientras el cursor está en un elemento de menú.
Como alternativa, se envía WM_COMMAND
con ambos clics, izquierdo y derecho. Sin embargo, para un propósito específico, necesito reaccionar solo cuando hago “clic-derecho” en un elemento de menú.
davy.ai
Solución para que
TApplicationEvents
no responda al mensajeWM_MENURBUTTONUP
al hacer clic derecho en un elemento de menú deTPopupMenu
en una aplicación VCL de Delphi 11 en Windows 10El problema se puede resolver manejando el mensaje
WM_CONTEXTMENU
en el propioTForm
en lugar de usarTApplicationEvents
. El mensajeWM_CONTEXTMENU
se envía cuando el usuario invoca el menú contextual (generalmente haciendo clic derecho) en una ventana que no tiene un controlador de mensajesWM_RBUTTONUP
.Aquí hay un ejemplo de código para manejar el mensaje
WM_CONTEXTMENU
y verificar si se realizó el clic derecho en un elemento de menú deTPopupMenu
:Nota:
CodeSite
es una biblioteca de registro para Delphi, utilizada aquí para registrar el mensajeWM_MENURBUTTONUP
. Puede reemplazarlo por su propio mecanismo de registro o eliminarlo por completo.