Занятый курсор при наведении мыши на полосу прокрутки в ScrollableControl

Я использую функциональность AutoScroll в System.Windows.Forms.Panel для создания пользовательского прокручиваемого элемента управления. Все работает нормально, за исключением того факта, что при наведении курсора на полосы прокрутки курсор меняется на «занятый» курсор. Кажется, невозможно переопределить это поведение, поскольку я не могу получить экземпляры полосы прокрутки (они находятся внутри базового класса ScrollableControl). Я пробовал установить для Application.UseWaitCursor значение false, но это ничего не меняет.

Возможно, стоит упомянуть, что этот элемент управления работает внутри элемента управления ActiveX, который, в свою очередь, работает внутри Outlook. Все остальное работает как положено, вот только эта мелочь меня сбивает с толку...

Любые идеи? Вся помощь приветствуется!


person Phil    schedule 30.01.2011    source источник


Ответы (1)


Устраните эту проблему с помощью Spy++, обратите внимание на сообщение WM_SETCURSOR. У полосы прокрутки нет никаких причин для изменения курсора, вы увидите, что она возвращает FALSE (отображается как «fHaltProcessing: False в трассировке Spy++»). Что приводит к отправке сообщения родительскому элементу управления. Следуйте по трассировке, в конце концов вы столкнетесь с родительским окном, которое возвращает TRUE. Это тот, который изменил курсор.

Велики шансы, что это будет Outlook. Понятия не имею из вашего вопроса, почему он считает, что пользовательский интерфейс мертв. Получение собственного класса от Panel и переопределение WndProc() для перехвата сообщения было бы своего рода обходным путем. Однако я бы определенно сосредоточился на 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);
    }
}
person Hans Passant    schedule 30.01.2011
comment
Ганс, спасибо за совет. Я проверил это с помощью Spy++, и окно, в котором есть AutoScroll, похоже, возвращает TRUE. Однако, похоже, я не могу перехватывать сообщения WndProc... - person Phil; 30.01.2011
comment
Извините, моя ошибка - я действительно могу их перехватить (WM_SETCURSOR, 0x20), и это устраняет проблему. Исходное сообщение, по-видимому, запускается вверх по родительской иерархии за пределами элемента управления ActiveX, так что на данный момент этот бинт делает свое дело. Еще раз спасибо, что указали на это! - person Phil; 30.01.2011