Ho un NotifyIcon nella barra delle applicazioni. Come posso rilevare quando l'utente ha fatto clic con il pulsante sinistro del mouse su di esso? Ho pensato che l'evento MouseDown
sarebbe quello che voglio usare, ma si occupa solo di fare clic con il tasto destro e fare clic sul tasto centrale. Per il clic sinistro, si attiva solo dopo che l'utente ha lasciato andare (come in hanno appena eseguito un clic normale). C'è un modo per ottenere solo l'evento MouseDown?NotifyIcon ha un equivalente MouseDown?
risposta
Questo è di progettazione, la shell sintetizza il messaggio MouseDown dall'evento up. Vedrai perché funziona in questo modo quando fai clic e tieni premuto il pulsante, quindi inizi a trascinare. Osserva come appare la finestra di overflow dell'area di notifica e ti consente di trascinare l'icona al suo interno per rimuoverla dall'area visibile. Non può funzionare in entrambi i modi.
Tecnicamente è possibile agganciare la finestra di proprietà di Explorer.exe per ottenere una crepa sui messaggi prima che Explorer faccia con SetWindowsHookEx(). Ciò richiede comunque un tipo di DLL che non è possibile scrivere in C#, deve essere iniettato in Explorer. Molto destabilizzante e difficile da battere la concorrenza che sta cercando di fare la stessa cosa. Anche il tipo di codice che causa notti insonni per il team di Microsoft appcompat.
Sembra che il sottostante API Win32 Shell_NotifyIcon
invia un messaggio WM_LBUTTONDOWN
quando l'utente fa clic l'icona. Secondo lo MSDN in ogni caso.
L'esame del codice sorgente di Windows Form per NotifyIcon rivela la gestione degli eventi di spostamento del mouse standard, quindi se il messaggio Win32 è stato inviato nel momento "corretto" funzionerebbe come si desidera/si aspetta.
Devo concordare con un commento precedente che NotifyIcon ingerirà WM_LBUTTONDOWN poiché è necessario eseguire l'acquisizione del mouse per consentire all'utente di trascinare le icone.
È possibile che this article sulla creazione di un'icona di vassoio per WPF sia utile poiché mostra come utilizzare SetWindowsHookEx
ecc. Da C#.
Ciò significa che non c'è modo di gestire l'evento di mouse perché è di progettazione? – Skoder
Non credo ci sia un modo semplice. Potrebbe essere possibile agganciare i messaggi WM_XXX a un livello basso (in C++) prima che la barra delle applicazioni li gestisca, ma è da tanto che non faccio nulla del genere. – Phil
Ho provato anche diverse cose. Mi hai incuriosito Ho persino installato VS11 per provarlo anche lì. Senza fortuna. Penso quasi che sia un bug. Spero che qualcuno abbia anche una risposta. – JimDel
Penso che possa essere qualcosa a che fare con il fatto che può essere trascinato (che è gestito da Windows stesso piuttosto che dall'app). Forse l'evento 'mousedown' viene assorbito da Windows invece di tornare all'app. – Skoder
Quindi questo su [MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.mousedown.aspx) è totalmente impreciso? – Steve