Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用ctypes.windell.user32.setWindowsHookXW钩住ctypes.windell.user32.MessageBoxW?_Python_Ctypes - Fatal编程技术网

Python 如何使用ctypes.windell.user32.setWindowsHookXW钩住ctypes.windell.user32.MessageBoxW?

Python 如何使用ctypes.windell.user32.setWindowsHookXW钩住ctypes.windell.user32.MessageBoxW?,python,ctypes,Python,Ctypes,我想做一个笑话程序,它首先打开一个消息框,然后关闭,然后在一个随机位置出现另一个消息框。它会一直这样重复,直到有任何事情结束它的任务。如果使用tkinter消息框,那么这些消息框就不能被钩住,我必须制作另一个tkinter表单(它非常难看,与Windows消息框不同)。所以我切换到ctypes,问题开始了。然后,我为钩子创建了一个回调函数,当我将该函数传递给ctypes.windell.user32.SetWindowsHookExA函数的第二个参数时,它会显示TypeError:Error t

我想做一个笑话程序,它首先打开一个消息框,然后关闭,然后在一个随机位置出现另一个消息框。它会一直这样重复,直到有任何事情结束它的任务。如果使用tkinter消息框,那么这些消息框就不能被钩住,我必须制作另一个tkinter表单(它非常难看,与Windows消息框不同)。所以我切换到ctypes,问题开始了。然后,我为钩子创建了一个回调函数,当我将该函数传递给ctypes.windell.user32.SetWindowsHookExA函数的第二个参数时,它会显示TypeError:Error type。我怎样才能解决这个问题

我曾尝试将函数强制转换为c_void_p,但这样做只会导致更多错误,如“非法指令”

这是我的代码:

导入ctypes,随机
def msgBoxHook(nCode、wParam、lParam):
如果nCode==3:
hwnd=ctypes.wintypes.hwnd
hwnd=wParam
msgRekt=ctypes.wintypes.RECT#>:)
ctypes.windell.user32.GetWindowRect(hwnd,ctypes.byref(msgRekt))
ctypes.windell.user32.MoveWindow(hwnd,randint(0,ctypes.windell.user32.GetSystemMetrics(0)),randint(0,ctypes.windell.user32.GetSystemMetrics(1)),msgRekt.right-msgRekt.left,msgRekt.bottom-msgRekt.top,True)
返回ctypes.windell.user32.CallNextHookEx(0,nCode,wParam,lParam)
#当我试着打电话时
ctypes.windell.user32.SetWindowsHookExA(5,msgBoxHook,0,ctypes.windell.kernel32.GetCurrentThreadId())
#它表明:
"""
回溯(最近一次呼叫最后一次):
文件“test.py”,第1行,在
ctypes.ArgumentError:参数2::错误类型
"""
预期:当使用ctypes.windell.user32.MessageBoxW(无,'Hello','World',0x00000010 | 0x00000000)时,它会在随机位置打开一个消息框,标题为'World',文本为'Hello',并带有OK按钮的停止图标

现实:如上所示。

列表

不能将Python对象传递给普通的C函数(我的意思是可以,但结果不会是预期的)

当其第一个参数为WH_CBT(5)时,应为
因此,您必须包装您的函数:

WH_CBT=5
HOOKProc=ctypes.WINFUNCTYPE(wintypes.LPVOID、ctypes.c_int、wintypes.WPARAM、wintypes.LPARAM)
CBTProc=HOOKProc
hook=ctypes.windell.user32.setWindowshookxa(WH_CBT,CBTProc(msgBoxHook),0,ctypes.windell.kernel32.GetCurrentThreadId())
这将帮助您解决当前的问题。但你肯定会遇到其他人(当然,这可能是其他问题的主题)
我已经发现的一个问题是,没有为您使用的任何函数定义argtypes和restype,因此(几乎)肯定会给您带来麻烦(崩溃)。一些例子:

列表

不能将Python对象传递给普通的C函数(我的意思是可以,但结果不会是预期的)

当其第一个参数为WH_CBT(5)时,应为
因此,您必须包装您的函数:

WH_CBT=5
HOOKProc=ctypes.WINFUNCTYPE(wintypes.LPVOID、ctypes.c_int、wintypes.WPARAM、wintypes.LPARAM)
CBTProc=HOOKProc
hook=ctypes.windell.user32.setWindowshookxa(WH_CBT,CBTProc(msgBoxHook),0,ctypes.windell.kernel32.GetCurrentThreadId())
这将帮助您解决当前的问题。但你肯定会遇到其他人(当然,这可能是其他问题的主题)
我已经发现的一个问题是,没有为您使用的任何函数定义argtypes和restype,因此(几乎)肯定会给您带来麻烦(崩溃)。一些例子:


对不起,我的意思是设置Windows Hookxa…修复缩进。什么是nCode?检查。
defmsgboxhook(nCode、wParam、lParam):
,再次抱歉。。。顺便说一句,为了简单起见,我使用空格而不是制表符。对不起,我的意思是SetWindowsHookxa…修复缩进。什么是nCode?检查。
defmsgboxhook(nCode、wParam、lParam):
,再次抱歉。。。顺便说一句,为了简单起见,我用空格代替制表符。@TrietVoNguyenMinh:这回答了你的问题吗?如果是,请接受答案,以便其他人也能承认()。@TrietVoNguyenMinh:这回答了你的问题吗?如果是,请接受答案,以便其他人也能够承认()。