Cursore occupato quando si passa con il mouse sulla barra di scorrimento in ScrollableControl
-
27-10-2019 - |
Domanda
Sto utilizzando la funzionalità AutoScroll
in System.Windows.Forms.Panel
per creare un controllo scorrevole personalizzato.Tutto funziona bene, a parte il fatto che quando passo il mouse sulle barre di scorrimento il cursore si trasforma in un cursore "occupato".Non sembra essere possibile ignorare questo comportamento poiché non riesco a ottenere le istanze della barra di scorrimento (sono all'interno della classe base ScrollableControl
).Ho provato a impostare Application.UseWaitCursor
su false, ma ciò non cambia nulla.
Potrebbe valere la pena ricordare che questo controllo è in esecuzione all'interno di un controllo ActiveX, che a sua volta è in esecuzione all'interno di Outlook.Tutto il resto funziona come previsto, solo questa piccola cosa mi sta sbalordendo ...
Qualche idea?Tutto l'aiuto è stato apprezzato!
Soluzione
Risolvi questo problema con Spy ++, presta attenzione al messaggio WM_SETCURSOR.Una barra di scorrimento non ha alcun motivo per cambiare il cursore, vedrai che restituisce FALSE (mostrato come 'fHaltProcessing: False nella traccia Spy ++).Che fa sì che il messaggio venga inviato al padre del controllo.Segui la traccia, alla fine ti imbatterai in una finestra genitore che restituisce TRUE.Quello è quello che ha cambiato il cursore.
Ci sono buone probabilità che questo sia Outlook.Nessuna idea dalla tua domanda perché pensa che l'interfaccia utente sia morta.Derivare la propria classe da Panel e sovrascrivere WndProc () per catturare il messaggio sarebbe una sorta di soluzione alternativa.Tuttavia, mi concentrerei sicuramente prima su Outlook.
using System;
using System.Windows.Forms;
class MyPanel : Panel {
protected override void WndProc(ref Message m) {
if (m.Msg == 0x20) { // Trap WM_SETCURSOR
Cursor.Current = Cursors.Default;
m.Result = (IntPtr)1;
}
else base.WndProc(ref m);
}
}