Как прокрутить список заметок в OneNote с помощью колесика мыши в Windows 7?

1248
user1306322

Как правило, когда вы перемещаете курсор внутри списка с помощью полосы прокрутки, колесо мыши будет прокручивать этот список. Однако в OneNote я могу прокручивать только страницу заметки, когда курсор определенно находится в списке заметок (синяя область на этом рисунке):

Необычный GIF, это позор, если вы этого не видите

Кажется, не имеет значения, можно ли прокрутить страницу или нет, колесо мыши не прокручивает список заметок, когда оно находится в синей зоне. Я могу только прокрутить его, взаимодействуя с полосой прокрутки левой кнопкой мыши.

Похоже, это проблема Windows 7 (возможно, это ОС, или, возможно, в версии OneNote для 7 есть эта ошибка). Windows 10, похоже, не имеет этой проблемы вообще.

0
Не все программы принимают все формы ввода. Точно так же кнопки «Назад» и «Далее» моей мыши не запускают ничего в программах, где нет ничего подходящего для запуска. Я думаю, что работал в других программах Windows, которые игнорируют прокрутку мышью, но не вспоминают их по макушке. Для того, чтобы что-то произошло, разработчики должны специально запрограммировать «Делать это, когда получено событие подкачки мыши». Christopher Hostage 7 лет назад 0
@ChristopherHostage это проблема, специфичная для Windows 7. В Windows 10 она работает просто отлично. user1306322 7 лет назад 0

1 ответ на вопрос

0
user1306322

Новое, намного более простое решение с использованием AutoHotKey

Я искал способ избежать зависаний, вызванных постоянными проверками активного окна, а также более простого решения кода. Вот что я сделал:

#ifWinActive ahk_class Framework::CFrame WheelUp:: ControlGetFocus, control, A Loop 3 SendMessage, 0x115, 0, 0, %control%, A Return  #ifWinActive ahk_class Framework::CFrame WheelDown:: ControlGetFocus, control, A Loop 3 SendMessage, 0x115, 1, 0, %control%, A Return 

Изменение Loop 3к Loop 5или сколько линий вы хотите за одно движение колеса прокрутки.


старое решение с использованием AutoIt

Примечание: это решение может вызвать заикание и случайные зависания на старых процессорах или при полной загрузке процессора.

Я включил скрипт AutoIt, который обнаруживает курсор в области списка заметок и, если вы прокручиваете вверх или вниз, нажимает кнопки «вверх» и «вниз» на полосе прокрутки. Это работает с несколькими окнами OneNote. Вам не нужно фокусироваться на окне, чтобы прокрутка работала, просто наведите курсор на этот список:

#include <AutoItConstants.au3> #include <MsgBoxConstants.au3> #include <MouseOnEvent.au3> ; get it from https://www.autoitscript.com/forum/topic/64738-mouseonevent-udf/ #include <WinAPI.au3> #include <Misc.au3>  _MouseSetOnEvent($MOUSE_WHEELSCROLLUP_EVENT, 'MouseWUp') _MouseSetOnEvent($MOUSE_WHEELSCROLLDOWN_EVENT, 'MouseWDown') Opt("WinTitleMatchMode", 2) ; 2 - substring mode  Global $clicks = 3 ; how many items to scroll per scroll, change this to 5, 8, 13, 42 or however fast you wanna scroll  Func MouseWUp($iEvent) If StringInStr(WinGetTitle($hWin), " - OneNote") Then  ; check if cursor is within the notes list and not anywhere else Local $cur = MouseGetPos() Local $handle = $hWin ;WinGetHandle("[ACTIVE]") Local $wpos = WinGetPos($handle) ; returna array of x,y,w,h Local $cpos = ControlGetPos ($handle, "", "[CLASS:NetUIHWND; INSTANCE:5]") ;MsgBox($MB_SYSTEMMODAL, "title", "win2:" & $wpos[2] & "; win3:" & $wpos[3] & "; cp2:" & $cpos[2] & "; cp3:" & $cpos[3])  If ($cur[0] > $wpos[0] + $wpos[2] - $cpos[2]) And ($cur[0] < $wpos[0] + $wpos[2]) Then  Local $x = $cpos[2] - 2 Local $y = 58 ControlClick($handle, "", "[CLASS:NetUIHWND; INSTANCE:5]", "left", $clicks, $x, $y)  EndIf  EndIf EndFunc  Func MouseWDown($iEvent) If StringInStr(WinGetTitle($hWin), " - OneNote") Then  Local $cur = MouseGetPos() Local $handle = $hWin ;WinGetHandle("[ACTIVE]") Local $wpos = WinGetPos($handle) Local $cpos = ControlGetPos ($handle, "", "[CLASS:NetUIHWND; INSTANCE:5]")  If ($cur[0] > $wpos[0] + $wpos[2] - $cpos[2]) And ($cur[0] < $wpos[0] + $wpos[2]) Then  Local $x = $cpos[2] - 2 Local $y = $cpos[3] - 8 ControlClick($handle, "", "[CLASS:NetUIHWND; INSTANCE:5]", "left", $clicks, $x, $y)  EndIf EndIf EndFunc  ; https://stackoverflow.com/a/11270659 Func _WindowFromPoint($iX,$iY) Local $stInt64,$aRet,$stPoint=DllStructCreate("long;long") DllStructSetData($stPoint,1,$iX) DllStructSetData($stPoint,2,$iY) $stInt64=DllStructCreate("int64",DllStructGetPtr($stPoint)) $aRet=DllCall("user32.dll","hwnd","WindowFromPoint","int64",DllStructGetData($stInt64,1)) If @error Then Return SetError(2,@error,0) If $aRet[0]=0 Then Return SetError(3,0,0) Return $aRet[0] EndFunc  Local $hControl, $hWin, $hOldWin, $aMousePos $hOldWin = "" While True ;Not _IsPressed("1B") $aMousePos = MouseGetPos() $hControl=_WindowFromPoint($aMousePos[0],$aMousePos[1]) ; Since _WindowFromPoint() can return 'sub' windows, or control handles, we should seek the owner window $hWin=_WinAPI_GetAncestor($hControl,2) If $hWin <> $hOldWin Then ;TrayTip("Window Info","Window under mouse = " & WinGetTitle($hWin), 1) $hOldWin = $hWin EndIf Sleep(10) WEnd 

Я не выяснил, как предотвратить влияние свитков на страницу заметок. Если кто-то найдет способ заблокировать событие прокрутки от достижения основной области заметок из области списка заметок, пожалуйста, поделитесь своим решением, чтобы мы могли объединить сценарии для достижения наилучших результатов.