【问题标题】:Not showing multiple messagebox using ctypes on python未在 python 上使用 ctypes 显示多个消息框
【发布时间】:2016-02-12 14:24:02
【问题描述】:

您好,我有一个使用 ctypes 显示消息框的简单代码 但我的问题是在我添加 MB_TOPMOST 后它没有附加或重叠消息框?

def msgbox(self,msg):
        MB_OK = 0x0
        MB_OKCXL = 0x01
        MB_YESNOCXL = 0x03
        MB_YESNO = 0x04
        MB_HELP = 0x4000
        ICON_EXLAIM=0x30
        ICON_INFO = 0x40
        ICON_STOP = 0x10
        MB_TOPMOST=0x40000
        """
                HEX VALUE LINK
        https://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm
        """
        writeLogs = WriteLogs(
                    pathLog = app_config['path_logs'] +"\\"+strftime("%Y_%m_%d")+".log",
                    timedate = time.strftime("%m/%d/%Y %I:%M:%S %p")
                    )
        writeLogs.appendLogA(msg)
        ctypes.windll.user32.MessageBoxA(None, msg+str(operatorMessage), "[Error]", MB_OK | ICON_STOP | MB_TOPMOST)

【问题讨论】:

    标签: windows python-2.7 ctypes messagebox


    【解决方案1】:

    我尝试将 MB_TOPMOST 更改为 MB_SYSTEMMODAL 和我想要的输出,其中包含最顶部和重叠的消息错误框。

    你可以参考这个链接: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505%28v=vs.85%29.aspx

    还有这篇关于 stackoverflow 的帖子给了我一个想法: Have Win32 MessageBox appear over other programs

    def msgbox(self,msg):
            MB_OK = 0x0
            MB_OKCXL = 0x01
            MB_YESNOCXL = 0x03
            MB_YESNO = 0x04
            MB_HELP = 0x4000
            ICON_EXLAIM=0x30
            ICON_INFO = 0x40
            ICON_STOP = 0x10
            MB_TOPMOST=0x40000
            MB_SYSTEMMODAL=0x1000
            """
                    HEX VALUE LINK
            https://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm
            """
            writeLogs = WriteLogs(
                        pathLog = app_config['path_logs'] +"\\"+strftime("%Y_%m_%d")+".log",
                        timedate = time.strftime("%m/%d/%Y %I:%M:%S %p")
                        )
            writeLogs.appendLogA(msg)
            ctypes.windll.user32.MessageBoxA(None, msg+str(operatorMessage), "[Error]", MB_OK | ICON_STOP | MB_SYSTEMMODAL)
    

    【讨论】:

    • 在你的类中你应该设置_user32 = ctypes.WinDLL('user32')。然后参考self._user32.MessageBoxA。问题是ctypes.windll.user32.MessageBoxA 由所有模块共享,因此任何模块都可以设置argtypeserrcheck 属性以破坏您的代码。
    • 您好先生,感谢您的评论,但是您能提供一个示例代码吗?
    • msgbox 是某个类的方法,因为第一个参数是self。我建议在类主体中定义_user32 = ctypes.WinDLL('user32'),作为一个类属性,您可以从实例中将其引用为self._user32。这将是您的 ctypes.WinDLL('user32') 的私​​人副本,而不是使用共享的 ctypes.windll.user32。请注意,ctypes.windll.user32 是通过调用 ctypes.WinDLL('user32') 并将结果缓存到 ctypes.windll 加载程序来实现的。这个缓存的实例被所有使用ctypes.windll的模块共享,应该避免。
    • 感谢您的快速回复先生...我想我明白您所说的。另一件事是,这段代码在调用时能够多次弹出消息框。有没有办法杀死/关闭一次生成的所有消息框??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2019-01-31
    • 2021-12-10
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多