使用 ctypes 和 windll 的带有图标的 Python MessageBox

Posted

技术标签:

【中文标题】使用 ctypes 和 windll 的带有图标的 Python MessageBox【英文标题】:Python MessageBox with Icons using ctypes and windll 【发布时间】:2015-01-31 03:33:20 【问题描述】:

因此,我正在寻找一种仅使用本机库在 Python 中创建简单消息框的方法,并遇到了几篇文章,但即 this one,利用 ctypes 导入 win32.dll 并调用其 MessageboxA 函数。

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

我觉得很酷的东西。

--- 但是---

当我查看documentation for MessageboxA on Microsoft's site 时,发现这个MessageboxA 函数可以做更多的事情。我只是不知道如何正确传递参数。

我正在尝试找出提升带有图标的消息框的标准方法,例如消息旁边的 systemhand 或警告图标。 Microsoft 的文档表明应该将其输入到 uType 参数中,这是最后一个参数,但除了更改消息框的按钮之外,我无法在此处取得任何进展。

【问题讨论】:

【参考方案1】:

你只是他们在一起

import ctypes
MB_OK = 0x0
MB_OKCXL = 0x01
MB_YESNOCXL = 0x03
MB_YESNO = 0x04
MB_HELP = 0x4000
ICON_EXLAIM=0x30
ICON_INFO = 0x40
ICON_STOP = 0x10

result = ctypes.windll.user32.MessageBoxA(0, "Your text?", "Your title", MB_HELP| MB_YESNO | ICON_STOP)

我从您链接到的文档中获得了十六进制值

【讨论】:

哇!想着要努力解决这个问题。大声笑非常感谢乔兰 Joran,你能告诉我你是如何破译这些十六进制值的吗?您使用的十六进制值似乎是微软在其网站上显示的缩写形式。我最初尝试传递 microsoft 指示的十六进制值,但它们从未起作用。你的确实有效,我只是不知道你是如何从 0x00000030L 到 0x30,这是微软文档为感叹号图标指示的值 左边的零不是数字的一部分,例如十进制的 97 与 00097 相同...我可以很容易地写成 0x00000030 ... L 仅表示 long 就像在数据类型(任何以0x 开头的数字都只是一个十六进制数字) OR 将它们组合在一起的原因是什么? 我不明白你的问题?这就是你总是在我见过的任何例子的每个例子中组合整数标志的方式......我想我知道当有人说“组合这些整数”时,我知道他们的意思是or他们在一起

以上是关于使用 ctypes 和 windll 的带有图标的 Python MessageBox的主要内容,如果未能解决你的问题,请参考以下文章

使用 python ctypes.windll.ODBCCP32.SQLConfigDataSource 添加 ODBC 用户 DSN

python引用c的dll

使用 ctypes 时 Dll 函数的名称错误 [重复]

ctypes 模块

蟒蛇 |使用 ctypes 访问 dll

Python ctypes:如何将 ctypes 数组传递给 DLL?