Python 2.6中的ctypes帮助

时间:2009-06-17 04:26:50

标签: python ctypes

我似乎无法让这段代码工作,我的印象是我正确地做了这个。

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

3 个答案:

答案 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为MessageBoxAMessageBoxW,具体取决于是否启用了Unicode(具体而言,如果符号为{{1}已定义)。

其次,根据MessageBox() documentation_UNICODE位于MessageBoxA/W,而不是user32.dll

试试这个(我无法验证它,因为我现在不在Windows机顶前):

kernel32.dll

答案 2 :(得分:0)

哦,任何时候你都很困惑,如果一个电话需要kernel32或user32或其他类似的东西。不要害怕在MSDN上寻找呼叫。他们有Alphabetical List以及基于categories的列表。 希望你发现它们有用。