我最近开始学习Python并写了一个小脚本,当某个网站更改内容时通知我。然后我将它作为计划任务添加到Windows,以便它可以每10分钟运行一次。我想立即通知网站更改,因此我添加了一个win32ui MessageBox,如果脚本检测到网站已更改,则会弹出该消息框。这是我用于MessageBox的小代码片段(富有想象力的文字,我知道):
win32ui.MessageBox("The website has changed.", "Website Change", 0)
我的问题是这个,我花了大部分时间使用远程桌面,所以当MessageBox弹出它位于远程桌面会话后面时,有没有办法强制MessageBox出现在它上面?
在类似的说明中,当脚本运行时,命令行会在我不想要的远程桌面会话上非常简短地打开,是否有任何方法可以阻止此行为?
我对Windows特定的解决方案感到满意,因为我知道它可能意味着处理窗口管理器,或者可能是另一种通知我而不是使用MessageBox的方法。
答案 0 :(得分:8)
当您从任务计划程序启动任何内容时,Windows会阻止任何“简单”方式将您的窗口或对话框置于顶端。
第一种方式 - 使用MB_SYSTEMMODAL
(4096值)标志。根据我的经验,它使Msg对话框“永远在顶部”。
win32ui.MessageBox("The website has changed.", "Website Change", MB_SYSTEMMODAL)
第二种方式 - 尝试使用以下调用将控制台/窗口/对话框置于前面。当然,如果您使用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
答案 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'):])