Como posso fazer uma bandeja do sistema (área de notificação) ícone receber mensagens WM_MOUSEWHEEL?
-
01-07-2019 - |
Pergunta
Eu quero estender um aplicativo existente que fiz para torná-lo definir o volume do misturador de roda de rolagem sobre seu ícone da área de notificação.
Tanto quanto eu sei, a área de notificação não receber mensagens WM_MOUSEWHEEL, mas ainda assim eu encontrei um aplicativo que faz exatamente o que eu quero alcançar ( http://www.actualsolution.com/power_mixer ). Usando WinspectorSpy Tenho notado algumas mensagens estranhas formulário do aplicativo recebe:. 0x000003d0 e 0x000003d1, mas eu não encontrou referências sobre eles
Alguém tem alguma idéia de como eu poderia conseguir a funcionalidade desejada?
Solução
Se você deseja capturar eventos do mouse / teclado fora do seu aplicativo, você precisa Baixo nível Hooks .
Um artigo agradável iniciantes sobre como instalar um gancho do mouse em Delphi é Como Hook o mouse para capturar eventos fora do seu aplicativo em About.com escrito por Zarko Gajic.
O usuário que inicia o aplicativo terá direitos administrativos para instalar um gancho.
Depois de capturar a mensagem que deve determinar se é acima do seu ícone na barra de notificação (que pode ser difícil, porque não há api exatos para obter a sua posição no bar) e do processo o evento scroll.
Outras dicas
Eu expliquei sobre a enganchar rato, e mencionou que poderia ser difícil para localizar o ícone exato. Eu tinha encontrado o seguinte artigo sobre como localizar um ícone da bandeja.
CTrayIconPosition - onde está minha bandeja ícone por Irek Zielinski. Eu acho que se você tentar entender como ele funciona, você pode transformá-lo em torno e usá-lo para verificar se o mouse está posicionado acima do seu ícone.
Mas você deve primeiro verificar se o mouse é ainda na área da bandeja. Eu encontrei algum código antigo da mina (2005), que localiza a região correta.
var
hwndTaskBar, hwndTrayWnd, hwndTrayToolBar : HWND;
rTrayToolBar : tRect;
begin
hwndTaskBar := FindWindowEx (0, 0, 'Shell_TrayWnd', nil);
hwndTrayWnd := FindWindowEx (hwndTaskBar , 0, 'TrayNotifyWnd',nil);
hwndTrayToolBar := FindWindowEx(hwndTrayWnd, 0, 'ToolbarWindow32',nil);
Windows.GetClientRect(hwndTrayToolBar, rTrayToolBar);
end
Usando este pedaço de código eo conhecimento do artigo mencionado Eu acho que você poderia implementar a funcionalidade que você queria.
Não sei se isso vai resolver o problema, mas pode ser uma tentativa vale a pena como um ponto de partida. Você poderia criar uma janela transparente de alto nível que você, em seguida, posição por cima do ícone da barra de tarefas. Que a janela de nível superior receberá notificações de mouse quando o mouse está sobre ele. Você pode, em seguida, processá-los, conforme necessário. Como encontrar o local da tela do ícone da barra de tarefas é algo que eu não sei e para que possa ser um problema.
Id não sei se isso vai ajudá-lo, mas em Delphi os estados biblioteca mensagem padrão:
WM_MOUSEWHEEL = $ 020A;
Além disso, seria útil se você deixar como saber qual idioma você está usando.
Apenas pensei em apontar que Power Mixer é capturar eventos roda de rolagem em toda a barra de tarefas, enquanto o clique do mouse meio opera apenas na sys bandeja ícone.