- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我写这段代码是为了观察按键 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);
在这里,由于格式字符串中的 z
,win_name
变量中的数据被转换为带有 Py_BuildValue
假设它是 ASCII。但它不是:因此它可以触发 UnicodeDecodeError
。然后,这会导致 arglist
为 NULL
,因此您的函数将在没有参数的情况下被调用。
所以我不能完全确定这里的最佳解决方案。但我只是更改了两个代码位以使用宽字符和 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/
我正在制作一个键盘记录器,但我看到的每个源都需要该功能,但它无法正常工作。 我尝试更新库,但没有解决问题。除了下面的部分之外,所有代码都有效。我不知道下面的意思是什么。请帮助我理解。如果您知道类似的功
我想做类似于要求的事情 here , 但使用 threading 像 here .也使用来自 here 的答案,我的代码可以正常工作,只是无法识别 ItemAdd 事件(实际上,我认为是,但在另一个线
我很惊讶地发现没有很多关于函数 pythoncom.PumpMessages() 或 pythoncom 模块的解释文档。 那么 pythoncom.PumpMessages() 和 pythonco
我正在用 python 编写小键盘记录器。这是我的代码。 LOG_FILENAME = 'keylog.txt' def OnKeyboardEvent(event): logging.bas
我正在编写有关 pyHook 键盘记录的代码。以下代码为例: import pythoncom as pc, pyHook as ph def KeyboardHook(event): pri
这是我的脚本: import pyHook import pythoncom hookManager = pyHook.HookManager() def onKeyboardEvent(event)
我是这个 Python 世界的新手(只有 1 周)。我尝试安装 django-mssql,但当我尝试导入该库时(使用 import sqlserver_ado.dbapi),我收到此错误消息: Imp
我正在查看我的 outlook 邮件以获取所有附件并将它们保存在我的计算机中。 这是我的代码: import win32com.client import os, sys class OutlookL
我正在尝试使用 pyrtd Python获取信息的模块,可以通过RTD在Excel中获取信息。 但是,当我尝试运行 sample python script ,我收到以下错误: pywintypes.
是否可以从excel文件中获取表格并将其粘贴到保存其excel样式的word文档中?我没有找到有关 win32com 及其所有方法的足够文档。 我找到了一个方法PasteExcelTable,我想我应
我写这段代码是为了观察按键 Action 的事件。问题似乎是当这个脚本运行时,某些程序会崩溃这个程序,吐出这个错误信息: TypeError: KeyboardSwitch() missing 8 r
我用 python 编写了一个简单的键盘记录程序。该程序与 Python Interpreter 完美配合。然后,我使用 cx_freeze 将其转换为可执行文件。 现在的问题是存在导入错误。 我找不
我希望有人能帮助我从 Python 对 Excel 进行编码跨进程调用。 我有一个通过 Python 启动的 Excel session ,我知道它会在需要从单独的 Python 进程访问时启动并运行
我正在尝试创建一个在 python 3.4 中创建一个函数,该函数将对服务器执行 ping 操作。目前它只需要在 Windows 上工作(可能是 XP 及更高版本)。 我发现我可以使用 WMI Win
我正在尝试导入 pythoncom,但它给了我这个错误:Traceback(最近一次调用): 文件“F:/Documents and Settings/Emery/Desktop/Python 27/
我正在使用 Python 3.2.2,并构建了一个 Tkinter 界面来进行一些 Active Directory 更新。我在尝试处理 pythoncom.com_error 异常时遇到问题。 我从
编辑:如果我通过spyder运行以下代码两次,第二次运行它时会出现错误,第一次它总是有效: import pythoncom if __name__ == '__main__': print(
我是一名优秀的程序员,十分优秀!