Neue, viel einfachere Lösung mit AutoHotKey
Ich habe nach einem Weg gesucht, um Einfrieren durch ständige Überprüfungen des aktiven Fensters zu vermeiden, und auch nach einer insgesamt einfacheren Codelösung. Folgendes habe ich gemacht:
#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
Ändern Sie die Loop 3
zu Loop 5
oder wie viele Zeilen, die Sie für eine Bewegung des Rades wollen blättern.
alte Lösung mit AutoIt
Hinweis: Diese Lösung kann bei älteren CPUs oder bei voller CPU-Auslastung zum Stottern und gelegentlichen Einfrieren führen.
Ich zog ein AutoIt-Skript hoch, das den Cursor im Notizenlistenbereich erkennt. Wenn Sie nach oben oder unten blättern, klicken Sie auf die Schaltflächen "Auf" und "Ab" in der Bildlaufleiste. Dies funktioniert mit mehreren OneNote-Fenstern. Sie müssen sich nicht auf das Fenster konzentrieren, damit der Bildlauf funktioniert, bewegen Sie den Mauszeiger über diese Liste:
#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
Ich habe nicht herausgefunden, wie Sie verhindern können, dass die Blätter die Notizseite selbst beeinflussen. Wenn jemand einen Weg findet, das Bildlaufereignis aus dem Notizenlistenbereich heraus in den Hauptnotizbereich zu gelangen, teilen Sie Ihre Lösung bitte mit, damit wir die Skripts für beste Ergebnisse kombinieren können.