2016-02-12 8 views
2

Привет, У меня есть простой код, показывающий окно сообщения с использованием ctypes , но моя проблема заключается в том, что он не добавляет или перекрывает окно сообщений после добавления MB_TOPMOST?Не показывать несколько сообщений с использованием ctypes на python

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) 

ответ

5

Я попытался изменить 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) 
+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')' вместо использования shared 'ctypes.windll.user32'. Обратите внимание, что 'ctypes.windll.user32' реализуется путем вызова' ctypes.WinDLL ('user32') 'и кэширования результата на загрузчике' ctypes.windll'. Этот экземпляр кэша используется всеми модулями, использующими 'ctypes.windll', чего следует избегать. – eryksun

 Смежные вопросы

  • Нет связанных вопросов^_^