我似乎无法让这段代码工作,我的印象是我正确地做了这个。
from ctypes import *
kernel32 = windll.kernel32
string1 = "test"
string2 = "test2"
kernel32.MessageBox(None,
string1,
string2,
MB_OK)
**我尝试将其更改为MessageBoxA,如下所示** **错误我得到:: **
Traceback (most recent call last):
File "C:\<string>", line 6, in <module>
File "C:\Python26\Lib\ctypes\__init__.py", line 366, in __getattr__
func = self.__getitem__(name)
File "C:\Python26\Lib\ctypes\__init__.py", line 371, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'MessageBoxA' not found
答案 0 :(得分:4)
MessageBox在user32中定义而不是kernel32,您还没有定义MB_OK 所以请改用
windll.user32.MessageBoxA(None, string1, string2, 1)
我还建议使用python win32 API而不是它,因为它具有所有常量和命名函数
编辑:我的意思是使用这个
from ctypes import *
kernel32 = windll.kernel32
string1 = "test"
string2 = "test2"
#kernel32.MessageBox(None, string1, string2, MB_OK)
windll.user32.MessageBoxA(None, string1, string2, 1)
你可以用win32 api做同样的事情
import win32gui
win32gui.MessageBox(0, "a", "b", 1)
答案 1 :(得分:0)
问题是您尝试调用的函数实际上并未命名为MessageBox()
。有两个函数,名为MessageBoxA()
和MessageBoxW()
:前者采用8位ANSI字符串,后者采用16位Unicode(宽字符)字符串。在C中,预处理器符号MessageBox
#define
d为MessageBoxA
或MessageBoxW
,具体取决于是否启用了Unicode(具体而言,如果符号为{{1}已定义)。
其次,根据MessageBox()
documentation,_UNICODE
位于MessageBoxA/W
,而不是user32.dll
。
试试这个(我无法验证它,因为我现在不在Windows机顶前):
kernel32.dll
答案 2 :(得分:0)
哦,任何时候你都很困惑,如果一个电话需要kernel32或user32或其他类似的东西。不要害怕在MSDN上寻找呼叫。他们有Alphabetical List以及基于categories的列表。 希望你发现它们有用。