在 Python 中使用 Win32api 获取鼠标滚轮滚动
Get Mouse Wheel Scroll using Win32api in Python
我想读取鼠标滚轮滚动事件,然后模拟它们。
我知道我可以使用下面的代码模拟它。
#Scroll one up
win32api.mouse_event(MOUSEEVENTF_WHEEL, x, y, 1, 0)
#Scroll one down
win32api.mouse_event(MOUSEEVENTF_WHEEL, x, y, -1, 0)
但是,我在 Python 中找不到使用 win32api 获取 whell 滚动事件的方法。
有什么方法可以检测滚轮向上或向下滚动事件吗?
如果需要获取全局WM_MOUSEWHEEL
消息,可以使用SetWindowsHookEx
函数和withWH_MOUSE_LL
钩子。
然后在钩子函数中处理WM_MOUSEWHEEL
消息
这是一个示例:
import win32api
import win32con
import ctypes
from ctypes import windll, CFUNCTYPE, POINTER, c_int, c_void_p, byref
user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32
def LowLevelMouseProc(nCode, wParam, lParam):
if wParam == win32con.WM_MOUSEWHEEL:
print("mousewheel triggerd!")
return windll.user32.CallNextHookEx(hook_id, nCode, wParam, lParam)
if __name__ == '__main__':
CMPFUNC = CFUNCTYPE(c_void_p, c_int, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM)
pointer = CMPFUNC(LowLevelMouseProc)
hook_id = user32.SetWindowsHookExW(win32con.WH_MOUSE_LL,pointer,c_void_p(win32api.GetModuleHandle(None), 0)
msg = ctypes.wintypes.MSG()
while user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) != 0:
user32.TranslateMessage(msg)
user32.DispatchMessageW(msg)
对我有用:
编辑
如果出现<class'OverflowError'>: int too long to convert
这样的问题,可以试试下面的代码:
import win32api
import win32con
import ctypes
from ctypes import windll, CFUNCTYPE, c_int, c_void_p, wintypes
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)
我想读取鼠标滚轮滚动事件,然后模拟它们。 我知道我可以使用下面的代码模拟它。
#Scroll one up
win32api.mouse_event(MOUSEEVENTF_WHEEL, x, y, 1, 0)
#Scroll one down
win32api.mouse_event(MOUSEEVENTF_WHEEL, x, y, -1, 0)
但是,我在 Python 中找不到使用 win32api 获取 whell 滚动事件的方法。 有什么方法可以检测滚轮向上或向下滚动事件吗?
如果需要获取全局WM_MOUSEWHEEL
消息,可以使用SetWindowsHookEx
函数和withWH_MOUSE_LL
钩子。
然后在钩子函数中处理WM_MOUSEWHEEL
消息
这是一个示例:
import win32api
import win32con
import ctypes
from ctypes import windll, CFUNCTYPE, POINTER, c_int, c_void_p, byref
user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32
def LowLevelMouseProc(nCode, wParam, lParam):
if wParam == win32con.WM_MOUSEWHEEL:
print("mousewheel triggerd!")
return windll.user32.CallNextHookEx(hook_id, nCode, wParam, lParam)
if __name__ == '__main__':
CMPFUNC = CFUNCTYPE(c_void_p, c_int, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM)
pointer = CMPFUNC(LowLevelMouseProc)
hook_id = user32.SetWindowsHookExW(win32con.WH_MOUSE_LL,pointer,c_void_p(win32api.GetModuleHandle(None), 0)
msg = ctypes.wintypes.MSG()
while user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) != 0:
user32.TranslateMessage(msg)
user32.DispatchMessageW(msg)
对我有用:
编辑
如果出现<class'OverflowError'>: int too long to convert
这样的问题,可以试试下面的代码:
import win32api
import win32con
import ctypes
from ctypes import windll, CFUNCTYPE, c_int, c_void_p, wintypes
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)