Cursore occupato quando si passa con il mouse sulla barra di scorrimento in ScrollableControl

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

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!

È stato utile?

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top