简体   繁体   English

如何在 python win32api 上获取全局滚动事件

[英]How to get global scroll events on python win32api

How can I get global scroll events with win32api on Python?如何在 Python 上使用 win32api 获取全局滚动事件? I searched how can I do that and found answer: https://stackoverflow.com/a/65101276/8705882 , and it is not working due to an error.我搜索了如何做到这一点并找到答案: https://stackoverflow.com/a/65101276/8705882 ,由于错误而无法正常工作。

Traceback (most recent call last):
  File "H:/programing/p_python/woweyscroll/study1.py", line 21, in <module>
    hook_id = user32.SetWindowsHookExW(
ctypes.ArgumentError: argument 3: <class 'OverflowError'>: int too long to convert

If there is how to solve this error or another method of getting global mouse scroll event, please let me know!如果有解决此错误的方法或获取全局鼠标滚动事件的其他方法,请告诉我!

If you are running on a 64-bit system, using the win32api.GetModuleHandle(None) parameter will cause this error.如果在 64 位系统上运行,使用win32api.GetModuleHandle(None)参数会导致此错误。

The reason is that the function recognizes the parameter as C int, you can modify it to c_void_p(win32api.GetModuleHandle(None) to solve this problem.原因是function识别参数为C int,可以修改为c_void_p(win32api.GetModuleHandle(None)来解决这个问题。

hook_id = user32.SetWindowsHookExW(win32con.WH_MOUSE_LL,pointer,c_void_p(win32api.GetModuleHandle(None)), 0)

This can work normally under both 32-bit and 64-bit systems.这在 32 位和 64 位系统下都可以正常工作。

Edit编辑

import win32api 
import win32con
import ctypes
from ctypes import windll, CFUNCTYPE, c_int, c_void_p

 

user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32
user32.CallNextHookEx.argtypes = [ctypes.wintypes.HHOOK,c_int, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM]

 

def LowLevelMouseProc(nCode, wParam, lParam):
    if wParam == win32con.WM_MOUSEWHEEL:
        print("mousewheel triggerd!")
    return user32.CallNextHookEx(hook_id, nCode, wParam, lParam)

 

if __name__ == '__main__':
    CMPFUNC = CFUNCTYPE(c_void_p, c_int, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM)
    user32.SetWindowsHookExW.argtypes = [c_int,CMPFUNC,ctypes.wintypes.HINSTANCE,ctypes.wintypes.DWORD]
    pointer = CMPFUNC(LowLevelMouseProc)
    hook_id = user32.SetWindowsHookExW(win32con.WH_MOUSE_LL,pointer,win32api.GetModuleHandle(None), 0)
    msg = ctypes.wintypes.MSG()
    while user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) != 0:
        user32.TranslateMessage(msg)
        user32.DispatchMessageW(msg)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM