gpt4 book ai didi

python - ctypes 包装 "MessageBoxA"示例在 python33 中不起作用

转载 作者:太空狗 更新时间:2023-10-30 02:32:26 25 4
gpt4 key购买 nike

此示例在 python 3.3.2 文档中:

http://docs.python.org/3/library/ctypes.html?highlight=ctypes#ctypes

但是:当我在解释器中尝试时,出现错误。

我用的是windows7 32 python 3.3.2

请帮忙。

from ctypes import c_int, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCSTR, UINT
prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT)
paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", None), (1, "flags", 0)
MessageBox = prototype(("MessageBoxA", windll.user32), paramflags)
MessageBox()
MessageBox(text="Spam, spam, spam")
MessageBox(flags=2, text="foo bar")

error message:
Traceback (most recent call last):
File "<string>", line 250, in run_nodebug
File "<g1>", line 7, in <module>
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type

最佳答案

猜测这是文档中的一个错误。 ;-)

在 Python 3 中,默认情况下所有字符串都是 Unicode,但示例调用的是 ANSIMessageBoxA 函数,而不是MessageBoxWUnicode 版本。参见 16.17.1.2. Accessing functions from loaded dllsctypes文档中。

因此,对于示例中的MessageBoxA,您可以通过调用locale.getpreferredencoding() 将函数的输入字符串参数编码为所需内容,从而使其正常工作:

from ctypes import c_int, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCSTR, UINT
import locale
preferred_encoding = locale.getpreferredencoding(False)
prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT)
paramflags = ((1, "hwnd", 0), (1, "text", "Hi".encode(preferred_encoding)),
(1, "caption", None), (1, "flags", 0))
MessageBox = prototype(("MessageBoxA", windll.user32), paramflags)

MessageBox()
MessageBox(text="Spam, spam, spam".encode(preferred_encoding))
MessageBox(flags=2, text="foo bar".encode(preferred_encoding))

使用支持“宽”Unicode 字符串参数的MessageBoxWWindows 函数(LPCWSTR而不是LPCSTR ) 使得几乎每次调用都不需要对它们进行显式编码。此外,我会用命名常量替换示例中的大部分“魔数(Magic Number)”:

from ctypes import c_int, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCWSTR, UINT
import win32con # contains Win32 constants pulled from the C header files
INPUT_PARM, OUTPUT_PARAM, INPUT_PARM_DEFAULT_ZERO = 1, 2, 4
prototype = WINFUNCTYPE(c_int, HWND, LPCWSTR, LPCWSTR, UINT)
paramflags = ((INPUT_PARM, "hwnd", 0),
(INPUT_PARM, "text", "Hi"),
(INPUT_PARM, "caption", None),
(INPUT_PARM, "flags", win32con.MB_HELP))
MessageBox = prototype(("MessageBoxW", windll.user32), paramflags)

MessageBox()
MessageBox(text="Spam, spam, spam")
MessageBox(flags=win32con.MB_ABORTRETRYIGNORE, text="foo bar")

关于python - ctypes 包装 "MessageBoxA"示例在 python33 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18164994/

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