Como posso fazer uma bandeja do sistema (área de notificação) ícone receber mensagens WM_MOUSEWHEEL?

StackOverflow https://stackoverflow.com/questions/90411

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top