4

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

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

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

在类似的注释中,当脚本运行时,命令行会在我不想要的远程桌面会话中非常短暂地打开,有没有办法阻止这种行为?

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

4

7 回答 7

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);
    

至于控制台窗口闪烁,您可以尝试在隐藏状态下启动 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
于 2012-08-01T18:35:16.827 回答
1

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

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

于 2012-08-01T19:33:31.500 回答
1

使用 ctypes 它显示一个 windows 错误消息框非常好用,

import ctypes
if condition:
    ctypes.windll.user32.MessageBoxW(0, u"Error", u"Error", 0)
于 2012-08-01T21:35:47.120 回答
1

这对我有用:

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)
于 2018-06-01T15:59:04.117 回答
0

使消息框系统模式化将导致它在每个应用程序上弹出,但在它被关闭之前无法与之交互。考虑创建一个可以放在前面的自定义对话框窗口,或者改用通知气泡。

于 2012-08-01T18:34:45.067 回答
0

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

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

我不确定 python Windows UI 库是否提供通知气球的包装器。

于 2012-08-01T20:43:05.823 回答
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'):])
于 2021-02-12T18:19:04.217 回答