不显示多个消息框在python上使用ctypes

问题描述:

嗨我有一个简单的代码显示消息框使用ctypes 但我的问题是它没有追加或重叠的消息框后,我已经添加MB_TOPMOST?不显示多个消息框在python上使用ctypes

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) 

我试图将MB_TOPMOST更改为MB_SYSTEMMODAL,并将最终输出与重叠的消息错误框一起输出。

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

而且这个职位上计算器给了我一个想法: 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) 
+0

在你的类的身体,你应该设置'_user32 = ctypes.WinDLL( 'USER32')'。然后引用'self._user32.MessageBoxA'。问题是'ctypes.windll.user32.MessageBoxA'被所有模块共享,所以任何模块都可以通过破坏你的代码的方式来设置'argtypes'或'errcheck'属性。 – eryksun

+0

嗨,先生,谢谢你的评论,但你可以有一个你谈论的示例代码? – iamcoder

+0

'msgbox'是某个类的方法,因为第一个参数是'self'。我建议在类的主体中定义'_user32 = ctypes.WinDLL('user32')',作为一个可以从实例引用为'self._user32'的类属性。这将是您的'ctypes.WinDLL('user32')'的私人副本,而不是使用共享的'ctypes.windll.user32'。请注意''ctypes.windll.user32'通过调用'ctypes.WinDLL('user32')'并在'ctypes.windll'加载器上缓存结果来实现。这个缓存的实例被所有使用'ctypes.windll'的模块共享,这应该避免。 – eryksun