使用ctypes和windll的Python消息框和图标

16

所以,我正在寻找一种使用本地库在Python中创建简单Messagebox的方法,并发现了几篇文章,但主要是这个,利用ctypes导入win32.dll并调用它的MessageboxA函数。

import ctypes  # An included library with Python install.
ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", 1)

听起来很酷,我想。

--- 但是 ---

当我访问Microsoft网站上的MessageBoxA文档时,发现这个MessageBoxA函数可以做更多的事情。我只是不知道如何正确地传递参数。

我正在尝试找出引发带有图标的消息框(例如系统手型或警告图标旁边的消息)的标准方法。 Microsoft的文档指示应在uType参数中输入此内容,该参数是最后一个参数,但是我除了更改消息框的按钮之外还没有取得任何进展。

1个回答

20

你只需将它们 OR 起来

import ctypes

# buttons
MB_OK = 0x0
MB_OKCXL = 0x01
MB_YESNOCXL = 0x03
MB_YESNO = 0x04
MB_HELP = 0x4000

# icons
ICON_EXCLAIM = 0x30
ICON_INFO = 0x40
ICON_STOP = 0x10

result = ctypes.windll.user32.MessageBoxA(0, "Your text?", "Your title", MB_HELP | MB_YESNO | ICON_STOP)
我从你提供的文档中获取了十六进制值。

1
Joran,你能告诉我你是如何解密那些十六进制值的吗?你使用的十六进制值似乎是微软网站上显示的缩写形式。我最初尝试按照微软指示的十六进制值传递,但它们从未起作用。你的确有效,只是我不知道你是如何从0x00000030L得到0x30的,而后者是微软文档中感叹号图标的值。 - MrBubbles
2
左侧的零不是数字的一部分,例如在十进制中,97与00097相同...我也可以写成0x00000030... L只是表示数据类型中的“long”(任何以“0x”开头的数字都是十六进制数)。 - Joran Beasley
@JoranBeasley 如果你这么说,我只是从来没有听说过“整数相加”。 - Mojimi
在C/C++中,这非常常见...但在Python中就不是那么常见了。 - Joran Beasley
1
我也会使用 MessageBoxW() 来正确处理 Unicode。 - Tiger-222
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接