Come posso fare in modo che un'icona nella barra delle applicazioni (area di notifica) riceva messaggi WM_MOUSEWHEEL?

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

  •  01-07-2019
  •  | 
  •  

Domanda

Voglio estendere un'applicazione esistente che ho creato per impostare il volume del mixer facendo scorrere la rotella sull'icona dell'area di notifica.

Per quanto ne so, l'area di notifica non riceve alcun messaggio WM_MOUSEWHEEL, ma ho comunque trovato un'applicazione che fa esattamente quello che voglio ottenere (http://www.actualsolution.com/power_mixer).Utilizzando WinspectorSpy ho notato alcuni strani messaggi ricevuti dal modulo dell'applicazione:0x000003d0 e 0x000003d1, ma non ho trovato riferimenti al riguardo.

Qualcuno ha qualche idea su come potrei ottenere la funzionalità desiderata?

È stato utile?

Soluzione

Se desideri acquisire eventi relativi al mouse/tastiera al di fuori della tua applicazione, avrai bisogno di Ganci di basso livello.

Un bell'articolo per principianti sull'installazione di un gancio per il mouse in Delphi è Come agganciare il mouse per catturare eventi esterni all'applicazione su About.com scritto da Zarko Gajic.

L'utente che avvia l'applicazione avrà bisogno dei diritti amministrativi per installare un hook.

Dopo aver catturato il messaggio dovresti determinare se è sopra la tua icona nella barra di notifica (il che può essere difficile perché non esiste un'API esatta per ottenere la tua posizione sulla barra) e quindi elaborare l'evento di scorrimento.

Altri suggerimenti

Ho spiegato come agganciare il mouse e ho detto che potrebbe essere difficile individuare l'icona esatta.Ho trovato il seguente articolo su come individuare un'icona nella barra delle applicazioni.

CTrayIconPosition: dov'è la mia icona nella barra delle applicazioni? di Irek Zielinski.Penso che se provi a capire come funziona puoi girarlo e usarlo per verificare se il tuo mouse è attualmente posizionato sopra la tua icona.

Ma dovresti prima controllare se il mouse si trova nell'area del vassoio.Ho trovato un mio vecchio codice (2005) che individua la regione corretta.

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

Utilizzando questo pezzo di codice e le conoscenze dell'articolo citato penso che potresti implementare la funzionalità che volevi.

Non sono sicuro che questo risolva il problema, ma potrebbe valere la pena provarlo come punto di partenza.Potresti creare una finestra trasparente di primo livello da posizionare sopra l'icona della barra delle applicazioni.Quella finestra di livello superiore riceverà notifiche del mouse quando il mouse è sopra di essa.È quindi possibile elaborarli come richiesto.Come trovare la posizione sullo schermo dell'icona sulla barra delle applicazioni è qualcosa che non so e quindi potrebbe essere un problema.

Non so se questo ti aiuterà, ma in Delphi la libreria messaggi standard afferma:

WM_MOUSEWHEEL = $020A;

Sarebbe anche utile se facessi sapere quale lingua stai utilizzando.

Ho pensato di sottolineare che Power Mixer cattura gli eventi della rotella di scorrimento sull'intera barra delle applicazioni, mentre il clic centrale del mouse funziona solo sull'icona della barra delle applicazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top