ctypes в Python 2.6 помогают - PullRequest
1 голос
/ 17 июня 2009

Я не могу заставить этот код работать, у меня сложилось впечатление, что я делаю это правильно.

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 ]

4 голосов
/ 17 июня 2009

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)
0 голосов
/ 17 июня 2009

Да, и каждый раз, когда вы запутываетесь, нужно ли вызову kernel32 или user32 или что-то в этом роде. Не бойтесь искать вызов на MSDN. У них есть Алфавитный список , а также список, основанный на категориях . Надеюсь, вы найдете их полезными.

0 голосов
/ 17 июня 2009

Проблема в том, что функция, которую вы пытаетесь вызвать, на самом деле не называется MessageBox(). Существует две функции с именами MessageBoxA() и MessageBoxW(): первая принимает 8-битные строки ANSI, а вторая - 16-битные строки Unicode (широкие символы). В C символ препроцессора MessageBox равен #define d и равен MessageBoxA или MessageBoxW, в зависимости от того, включен ли Unicode (в частности, если определен символ _UNICODE).

Во-вторых, согласно MessageBox() документации , MessageBoxA/W расположены в user32.dll, а не kernel32.dll.

Попробуйте это (я не могу проверить это, так как я не нахожусь перед коробкой Windows в настоящее время):

user32 = windll.user32
user32.MessageBoxA(None, string1, string2, MB_OK)
...