2016-02-12 63 views
2

嗨我有一個簡單的代碼顯示消息框使用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) 

回答

5

我試圖將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