让Win32 MessageBox出现在其他程序上

时间:2012-08-01 18:28:43

标签: python windows user-interface

我最近开始学习Python并写了一个小脚本,当某个网站更改内容时通知我。然后我将它作为计划任务添加到Windows,以便它可以每10分钟运行一次。我想立即通知网站更改,因此我添加了一个win32ui MessageBox,如果脚本检测到网站已更改,则会弹出该消息框。这是我用于MessageBox的小代码片段(富有想象力的文字,我知道):

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

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

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

我对Windows特定的解决方案感到满意,因为我知道它可能意味着处理窗口管理器,或者可能是另一种通知我而不是使用MessageBox的方法。

7 个答案:

答案 0 :(得分:8)

当您从任务计划程序启动任何内容时,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);
    
  3. 对于控制台窗口的闪烁,您可能会尝试以隐藏状态启动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
    

答案 1 :(得分:1)

通过使用pyw扩展名而不是简单地py命名脚本来完成避免命令窗口闪存的操作。您也可以使用pythonw.exe代替python.exe,这实际上取决于您的要求。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

使消息框系统模态化会使其弹出每个应用程序,但在解除之前不能进行任何交互。考虑创建一个自定义对话框窗口,您可以将其带到前面或使用通知气泡。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

这对我有用:

from ctypes import *
def MessageBox(title, text, style):
    sty = int(style) + 4096
    return windll.user32.MessageBoxW(0, text, title, sty) #MB_SYSTEMMODAL==4096
    ## Button Styles:
    ###  0:OK  --  1:OK|Cancel -- 2:Abort|Retry|Ignore -- 3:Yes|No|Cancel -- 4:Yes|No -- 5:Retry|No -- 6:Cancel|Try Again|Continue
    ## To also change icon, add these values to previous number
    ### 16 Stop-sign  ### 32 Question-mark  ### 48 Exclamation-point  ### 64 Information-sign ('i' in a circle)

用法:

MessageBox('Here is my Title', 'Message to be displayed', 64)

答案 6 :(得分:0)

在 Python 和 MSG 命令的帮助下非常简单的模态异步消息框(适用于 Win10):

# In CMD (you may use Username logged on target machine instead of * to send message to particular user):
msg /server:IP_or_ComputerName * /v /time:appearance_in_secs Message_up_to_255_chars 
# I.e. send "Hello everybody!" to all users on 192.168.0.110 disappearing after 5 mins 
msg /server:192.168.0.110 * /v /time:300 "Hello everybody!"

在 Python 中,我一直使用 subprocess 发送 CMD 命令,允许我读取和处理输出,查找错误等。

import subprocess as sp

name = 'Lucas'
message = f'Express yourself {name} in 255 characters ;)'
command = f'msg /server:192.168.0.110 * /v /time:360 "{message}"'
output = str(sp.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT))

if 'returncode=0' in output:
    pint('Message sent')
else:
    print('Error occurred. Details:\n')
    print(output[output.index('stdout=b'):])