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

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

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

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

1 ответ1

0

Новое, намного более простое решение с использованием 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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .