2015-07-29 2 views
4

Я привожу фокус на полосу прокрутки с помощью vScrollBar.Select(); Полоса прокрутки фокусируется, но она не прокручивается с помощью колеса мыши.ScrollBar не прокручивается на Select()

Он прокручивается, только если курсор мыши находится над полосой прокрутки.

Как прокрутить прокрутку прокрутки после Select(), не наведя курсор на полосу прокрутки?

Окружающая среда: Windows 10, Windows, формы, .NET 4,0

EDIT

Я заметил, что ScrollBar свитки должным образом, когда я "прокручивать" с двумя пальцами на сенсорной панели ноутбука , но не с колесиком мыши. Возможно ли, что проблема связана с драйвером мыши/сенсорной панели Windows 10?

+0

Используйте Spy ++, сообщите нам, какое окно получает сообщение WM_MOUSEWHEEL. –

+0

@HansPassant Когда мышь находится над панелью, панель получает сообщение WM_MOUSEWHEEL. Когда я перемещаюсь по полосе прокрутки, он получает сообщения WM_MOUSEWHEEL. Когда я просматриваю панель с помощью сенсорной панели, свиток прокручивается. http://s13.postimg.org/n8jpc1blz/screenshot_1097.png –

ответ

8

Я только что получил Win10 и подтвердил. Это побочный эффект новой функции Windows 10, настроенной в настройках> Устройства> Мышь & тачпада. Он называется «Прокрутка неактивных окон, когда я навис над ними», он включен по умолчанию. This web page упоминает об этом.

Это действительно приятная функция, я лично обязательно ее сохраню, и это, скорее всего, и ваши пользователи. Предыдущие версии Windows отправили сообщения с колесиком мыши в элемент управления с фокусом, что привело к тому, что многие пользователи стали привыкать к тому, как ведет себя мышь, скажем, в браузере. Обратите внимание, что панель прокрутки помогает, она перерисовывает большой палец, чтобы указать, что он больше не активен, когда вы перемещаете мышь с панели.

Фиксация технически возможна, вам придется перенаправить сообщение обратно на полосу прокрутки. Ничего особенно красивая:

public Form1() { 
     InitializeComponent(); 
     panel1.MouseWheel += RedirectMouseWheel; 
    } 

    private bool redirectingWheel; 

    private void RedirectMouseWheel(object sender, MouseEventArgs e) { 
     if (this.ActiveControl != sender && !redirectingWheel) { 
      redirectingWheel = true; 
      SendMessage(this.ActiveControl.Handle, 0x020A, 
       new IntPtr(e.Delta << 16), IntPtr.Zero); 
      redirectingWheel = false; 
      var hmea = (HandledMouseEventArgs)e; 
      hmea.Handled = true; 
     } 
    } 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 

Но не опережать пока, пользователи не склонны ожидать, что поведение Win10, в конце концов :)

+0

Я, вероятно, попытаюсь управлять событием «Колесо мыши» на панели управления и просто установить рассчитанные значения на полосу прокрутки. –

+0

Позор! Почему Microsoft это делает. Разработчики могут сами реализовать этот пользовательский опыт. Я догоняю MouseEnter на панели, я хочу прокрутить и выбрать() правильную полосу прокрутки.Он обеспечивает аналогичный пользовательский интерфейс для всех предыдущих версий Windows. Я делаю это с 10 лет. –

0

Чтобы использовать прокручиваемую панель Winforms с помощью колесика мыши, не используйте кнопку Scrollbar самостоятельно, вам нужно выбрать панель, изображение или что бы вы ни прокрутили.

+0

Это не решение в моем случае. Я пересчитываю свои представления в соответствии со значением полосы прокрутки. Это отлично работает в Win XP, 7, 8 и 8.1. –

-1

Не уверен, что вы, ребята, имеющие проблемы с мышью в новом Windows 10. У меня было много проблем с pf и много исследований, а также изменение настроек. Пробовал все, что было рекомендовано. Все это в Проводнике. Я перешел на Mozilla Firefox и вообще не имею проблем. Все работает отлично. Может быть, вариант для вас рассмотреть. Если вы используете Firefox и имеете проблему, не знаете. Удачи!

+0

Это не ответ – zed

Смежные вопросы