2012-08-01 150 views
2

我最近开始学习Python,并编写了一个脚本,通知我某个网站何时更改内容。然后我将它作为计划任务添加到Windows,以便每10分钟运行一次。我希望能够立即通知网站更改,所以我添加了一个win32ui MessageBox,如果脚本检测到网站已更改,它会弹出。下面是一些代码片段我使用了的MessageBox(富有想象力的文字,我知道):将Win32 MessageBox显示在其他程序

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

我的问题是这样的,我使用远程桌面,所以当在MessageBox并弹出它坐在花了我大部分时间在远程桌面会话后面,有什么办法强制MessageBox出现在它的顶部?

当脚本运行命令行时,类似的说明会在远程桌面会话中打开一个我不想要的东西,是否有任何方法可以阻止此行为?

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

回答

6

当您从任务计划程序启动任何内容时,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 
+0

如果这项工作,它将非常感谢,我不能尝试它,直到明天,但会回到你那里。有关阻止RDP会话弹出的命令窗口的任何想法,还是我必须忍受它?这只是一个轻微的烦恼,每10分钟就会弹出一次,而不是一个大问题。 – Peanut 2012-08-01 18:42:46

+0

在任务计划程序中,我调用类似“C:\ Python27 \ python.exe C:\ pythonScript.py”的程序,该程序运行该脚本并在关闭之前使命令行在短时间内弹出。 – Peanut 2012-08-01 18:53:03

+0

答复已更新。 – Maximus 2012-08-01 19:11:33

0

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

+0

“但没有一个能与互动,直到它被驳回”是不正确的,实际上。 MB_SYSTEMMODAL表示MessageBox将“始终在最前面”。就这样。 – Maximus 2012-08-01 18:37:03

+0

让它到微软得到“模态”错误... – 2012-08-01 18:37:58

+0

有没有办法打开一个消息框强制与它的交互?我只是想,如果我在远程桌面上工作,我会点击很多,如果它出现在我的另一台显示器上,并且很快就会最小化,可能会错过弹出窗口。 – Peanut 2012-08-01 18:46:46

0

Windows会尝试使它很难在活跃的应用程序弹出一个窗口。用户觉得烦人,特别是因为中断窗口通常会窃取键盘焦点。

Windows提供此类通知的方式是在通知区域使用气球而不是消息框。通知气球不会窃取焦点,并且(据说)不太注意力分散。

我不确定python Windows UI库是否提供notification balloons的包装。

+0

即使Python确实为通知提供了封装器,我也不认为这会起作用,那么通知会出现在远程桌面会话后面吗?虽然Outlook设法让通知以某种方式出现在RDP会话的左上角。 – Peanut 2012-08-01 20:51:35

1

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

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

我会看看这个谢谢。 – Peanut 2012-08-01 21:36:40

+1

在我的情况下,它仍然显示在另一个窗口下面... – ellockie 2016-10-07 14:31:45