Занят курсор при наведении мыши на полосу прокрутки в ScrollableControl - PullRequest
0 голосов
/ 30 января 2011

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

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

Есть идеи?Вся помощь оценена!

1 Ответ

0 голосов
/ 30 января 2011

Устраните неисправность в 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);
    }
}
...