gpt4 book ai didi

python - 如何使用 ctypes.windll.user32.SetWindowsHookExW Hook ctypes.windll.user32.MessageBoxW?

转载 作者:太空宇宙 更新时间:2023-11-03 20:45:59 27 4
gpt4 key购买 nike

我想制作一个笑话程序,首先它打开一个消息框,关闭后另一个消息框出现在随机位置。它会一直这样重复,直到有什么东西终止了它的任务。使用 tkinter 消息框,那么这些消息框就无法被 Hook ,我必须制作另一个 tkinter 表单(这真的很难看,并且与 Windows 消息框不同)。所以我切换到 ctypes,问题就开始了。然后,我为钩子(Hook)创建了一个回调函数,当我将该函数传递给 ctypes.windll.user32.SetWindowsHookExA 函数的第二个参数时,它显示 TypeError: 错误类型。我该如何解决这个问题?

我尝试将该函数转换为 c_void_p,但这样做只会出现更多错误,例如“非法指令”。

这是我的代码:

import ctypes, random

def msgBoxHook(nCode, wParam, lParam):
if nCode == 3:
hwnd = ctypes.wintypes.HWND
hwnd = wParam

msgRekt = ctypes.wintypes.RECT # >:)

ctypes.windll.user32.GetWindowRect(hwnd, ctypes.byref(msgRekt))
ctypes.windll.user32.MoveWindow(hwnd, randint(0, ctypes.windll.user32.GetSystemMetrics(0)), randint(0, ctypes.windll.user32.GetSystemMetrics(1)), msgRekt.right - msgRekt.left, msgRekt.bottom - msgRekt.top, True)
return ctypes.windll.user32.CallNextHookEx(0, nCode, wParam, lParam)

# When I try to call
ctypes.windll.user32.SetWindowsHookExA(5, msgBoxHook, 0, ctypes.windll.kernel32.GetCurrentThreadId())

# It shows:
"""
Traceback (most recent call last):
File "test.py", line 1, in <module>
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
"""

预期:当使用 ctypes.windll.user32.MessageBoxW(None, 'Hello', 'World', 0x00000010 | 0x00000000) 时,它会在随机位置打开一个消息框,标题为“World”,文本“Hello”和“停止”图标与“确定”按钮。

现实:如上所示。

最佳答案

列表[Python 3.Docs]: ctypes - A foreign function library for Python .

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

[MS.Docs]: SetWindowsHookExA function预计 [MS.Docs]: CBTProc callback function当其第一个st参数为WH_CBT (5)时。
所以,你必须包装你的函数:

WH_CBT = 5

HOOKProc = ctypes.WINFUNCTYPE(wintypes.LPVOID, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM)
CBTProc = HOOKProc

hook = ctypes.windll.user32.SetWindowsHookExA(WH_CBT, CBTProc(msgBoxHook), 0, ctypes.windll.kernel32.GetCurrentThreadId())

这应该可以帮助您解决当前的问题。但你肯定会遇到其他人(当然这可能是其他问题的主题)。
我已经发现,不要为您使用的任何函数定义argtypesrestype,这样(几乎)肯定会给你带来麻烦(崩溃)。一些例子:

关于python - 如何使用 ctypes.windll.user32.SetWindowsHookExW Hook ctypes.windll.user32.MessageBoxW?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56609098/

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