Как получить глобальные события прокрутки на python win32api

Как я могу получить глобальные события прокрутки с помощью win32api на Python? Я искал, как я могу это сделать, и нашел ответ: 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

Если есть способ решения этой ошибки или другой способ получения глобального события прокрутки мыши, сообщите мне!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы работаете в 64-битной системе, использование параметра win32api.GetModuleHandle(None) вызовет эту ошибку.

Причина в том, что функция распознает параметр как C int, вы можете изменить его на c_void_p(win32api.GetModuleHandle(None), чтобы решить эту проблему.

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

Это может нормально работать как в 32-битных, так и в 64-битных системах.

Редактировать

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)

Привет, если этот ответ помог вам, отметьте его, чтобы помочь людям с такой же проблемой, и дайте мне знать, если у вас возникнут какие-либо проблемы. Спасибо.

Zeus 25.12.2020 09:11

Это не решает проблему для меня. Соответствующая часть трассировки стека: return windll.user32.CallNextHookEx(hook_id, nCode, wParam, lParam) ctypes.ArgumentError: argument 4: <class 'OverflowError'>: int too long to convert.

ack 14.01.2021 20:07

@Alex Quilliam Может быть, вы можете использовать wintypes, я отредактировал свой ответ, и вы можете сослаться на него.

Zeus 15.01.2021 02:22

После импорта wintypes новый код работает, спасибо. Возможно, вам следует обновить свой ответ и на другой вопрос?

ack 15.01.2021 03:10

@AlexQuilliam Да, я изменил его, спасибо за напоминание.

Zeus 15.01.2021 03:12

Другие вопросы по теме