有Win32 MessageBox出现在其他程序

我最近开始学习Python,并写了一个脚本,告诉我什么时候某个网站改变内容。 然后,我将其作为计划任务添加到Windows,以便每10分钟运行一次。 我想通知网站改变马上,所以我添加了一个win32ui消息框,popup如果脚本检测到网站已经改变。 这里是我用于MessageBox的小代码片断(我知道有想象力的文本):

win32ui.MessageBox("The website has changed.", "Website Change", 0) 

我的问题是,我花了大部分时间使用远程桌面,所以当MessageBoxpopup时,它位于远程桌面会话后面,有没有办法强制MessageBox出现在它的顶部?

在脚本运行时,类似的说明命令行在我不想要的远程桌面会话上打开很短暂,有什么方法可以阻止这种行为?

我很高兴与Windows特定的解决scheme,因为我知道这可能意味着处理窗口pipe理器或可能的另一种方式来通知我,而不是使用MessageBox。

当您从任务计划程序启动任何东西时,Windows会阻止任何“ 简单 ”的方法将您的窗口或对话框置顶。

  1. 第一种方法 – 使用MB_SYSTEMMODAL (4096值)标志。 根据我的经验,它使Msg对话框“总是在最前面”。

     win32ui.MessageBox("The website has changed.", "Website Change", MB_SYSTEMMODAL) 
  2. 第二种方法 – 尝试通过以下调用将控制台/窗口/对话框置于前面。 当然,如果您使用MessageBox ,则必须在调用MessageBox之前执行此操作(对于您自己创建的窗口)。

     SetForegroundWindow(Wnd); BringWindowToTop(Wnd); SetForegroundWindow(Wnd); 

至于控制台窗口的闪烁,你可以尝试以隐藏状态启动Python。 例如,使用ConEmu ,'HidCon'或cmdow 。 请参阅其参数,如下所示:

 ConEmu -basic -MinTSA -cmd C:\Python27\python.exe C:\pythonScript.py or CMDOW /RUN /MIN C:\Python27\python.exe C:\pythonScript.py 

避免命令窗口闪光是通过用pyw扩展名而不是简单的py命名脚本完成的。 您也可以使用pythonw.exe而不是python.exe ,这取决于您的要求。

请参阅http://onlamp.com/pub/a/python/excerpts/chpt20/index.html?page=2

使用ctypes它显示一个非常容易使用的Windows错误消息框,

 import ctypes if condition: ctypes.windll.user32.MessageBoxW(0, u"Error", u"Error", 0) 

使消息框系统模式将导致它弹出每个应用程序,但没有人可以交互,直到它被解散。 考虑创建一个自定义对话框窗口,您可以将其带到前面或使用通知气泡。

Windows试图使其难以在活动应用程序上弹出一个窗口。 用户觉得烦人,特别是因为中断窗口通常会窃取键盘焦点。

Windows提供这样的通知的方式是在通知区域使用气球而不是消息框。 通知气球不偷窃焦点,(据说)较少分心。

我不知道如果python Windows用户界面库提供通知气球的包装。