gpt4 book ai didi

当使用 Hook 到某些应用程序时,pythoncom 在 KeyDown 上崩溃

转载 作者:太空狗 更新时间:2023-10-29 18:07:41 25 4
gpt4 key购买 nike

我写这段代码是为了观察按键 Action 的事件。问题似乎是当这个脚本运行时,某些程序会崩溃这个程序,吐出这个错误信息:

TypeError: KeyboardSwitch() missing 8 required positional arguments: 'msg', 'vk_
code', 'scan_code', 'ascii', 'flags', 'time', 'hwnd', and 'win_name'

观察到崩溃的一些程序是:Skype、Sublime Text 2

经过几次尝试调试后,问题似乎出现在最后一行,但我似乎无法缩小范围。我也不明白编译器返回的 KeyboardSwitch() 的含义...

我还发现该程序会交替返回此错误消息

Traceback (most recent call last):
File "C:\Python34\lib\site-packages\pyHook\HookManager.py", line 351, in KeyboardSwitch
return func(event)
File "observe.py", line 6, in OnKeyboardEvent
print ('MessageName:',event.MessageName)
TypeError: an integer is required (got type NoneType)

这是什么原因,我该如何解决这个问题,特别是因为它只在按下 2 个键中的 1 个时出现

import pyHook, pythoncom

def OnKeyboardEvent(event):
# Source: http://code.activestate.com/recipes/553270-using-pyhook-to-block-windows-keys/
print ('MessageName:',event.MessageName)
print ('Message:',event.Message)
print ('Time:',event.Time)
print ('Window:',event.Window)
print ('WindowName:',event.WindowName)
print ('Ascii:', event.Ascii, chr(event.Ascii))
print ('Key:', event.Key)
print ('KeyID:', event.KeyID)
print ('ScanCode:', event.ScanCode)
print ('Extended:', event.Extended)
print ('Injected:', event.Injected)
print ('Alt', event.Alt)
print ('Transition', event.Transition)
print ('---')

hooks_manager = pyHook.HookManager()
hooks_manager.KeyDown = OnKeyboardEvent
hooks_manager.HookKeyboard()
pythoncom.PumpMessages()

附言作为一个初学者,我对pythoncom的功能不是很熟悉,网上的定义也比较模糊。非常感谢对 pythoncom 和 PumpMessages 的功能的解释。

谢谢

最佳答案

我认为问题是当 pyHook 被 Windows 回调时,它做的第一件事是获取焦点窗口的窗口名称。

PSTR win_name = NULL;
...
// grab the window name if possible
win_len = GetWindowTextLength(hwnd);
if(win_len > 0) {
win_name = (PSTR) malloc(sizeof(char) * win_len + 1);
GetWindowText(hwnd, win_name, win_len + 1);
}

所以我认为这里的问题是,即使 GetWindowText 不返回宽字符,它也可以从 ANSI 代码页返回非 ascii 字符。然而,在我们这样做之前,这不会失败:

// pass the message on to the Python function
arglist = Py_BuildValue("(iiiiiiiz)", wParam, kbd->vkCode, kbd->scanCode, ascii,
kbd->flags, kbd->time, hwnd, win_name);

在这里,由于格式字符串中的 zwin_name 变量中的数据被转换为带有 Py_BuildValue 假设它是 ASCII。但它不是:因此它可以触发 UnicodeDecodeError。然后,这会导致 arglistNULL,因此您的函数将在没有参数的情况下被调用。

所以我不能完全确定这里的最佳解决方案。但我只是更改了两个代码位以使用宽字符和 unicode 而不是 ascii,并重建了 pyHook,这似乎修复了它。我认为它只适用于 Python 3 版本,但对于 Python 2,我认为旧的 pyHook 仍然有效。

LPWSTR win_name = NULL;

...
// grab the window name if possible
win_len = GetWindowTextLengthW(hwnd);
if(win_len > 0) {
win_name = (LPWSTR) malloc(sizeof(wchar_t) * win_len + 1);
GetWindowTextW(hwnd, win_name, win_len + 1);
}

// pass the message on to the Python function
arglist = Py_BuildValue("(iiiiiiiu)", wParam, kbd->vkCode, kbd->scanCode, ascii,
kbd->flags, kbd->time, hwnd, win_name);

只有在标题中包含非 ASCII 字符的窗 Eloquent 会出现此问题:Skype 就是其中之一。

关于当使用 Hook 到某些应用程序时,pythoncom 在 KeyDown 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26156633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com