windows 让Win32 MessageBox显示在其他程序上

fruv7luv  于 2023-06-24  发布在  Windows
关注(0)|答案(7)|浏览(175)

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

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

我的问题是,我大部分时间都在使用远程桌面,所以当MessageBox弹出时,它位于远程桌面会话的后面,有没有办法强制MessageBox出现在它的上面?
同样的,当脚本运行时,命令行会在远程桌面会话上非常短暂地打开,这是我不希望的,有什么方法可以阻止这种行为吗?
我很高兴与Windows的具体解决方案,因为我知道这可能意味着处理窗口管理器或可能的替代方式来通知我,而不是使用MessageBox。

pbpqsu0x

pbpqsu0x1#

当您从任务计划程序启动任何东西时,Windows会阻止任何将窗口或对话框置于顶部的“简单”方法。
1.第一种方式-使用MB_SYSTEMMODAL(4096值)标志。根据我的经验,它使消息对话框“总是在最上面”。

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

1.第二种方法-尝试使用Following调用将您的控制台/窗口/对话框放在前面。当然,如果你使用MessageBox,你必须在调用MessageBox之前这样做(对于你自己创建的窗口)。

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

至于控制台窗口的 Flink ,您可以尝试以隐藏状态启动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
cnjp1d6j

cnjp1d6j2#

避免命令窗口flash的方法是使用pyw扩展名而不是简单的py来命名脚本。您也可以使用pythonw.exe而不是python.exe,这真的取决于您的需求。
参见http://onlamp.com/pub/a/python/excerpts/chpt20/index.html?page=2

wrrgggsh

wrrgggsh3#

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

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

lx0bsm1f4#

这对我很有效:

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

jgovgodb5#

将消息框设置为系统模式将导致它在每个应用程序上弹出,但在它被关闭之前,不能与任何应用程序进行交互。请考虑创建一个可以放在最前面的自定义对话框窗口,或者使用通知气泡。

ckocjqey

ckocjqey6#

Windows试图使其难以在活动应用程序上弹出窗口。用户觉得这很烦人,特别是因为中断窗口通常会窃取键盘焦点。
Windows给予这样的通知的方式是在通知区域中使用气球而不是消息框。通知气球不会窃取焦点,而且(据说)更少分散注意力。
我不确定Python Windows UI库是否提供了notification balloons的 Package 器。

2eafrhcq

2eafrhcq7#

非常简单的模式异步消息框与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:
    print('Message sent successfully')
else:
    print('Error occurred. Details:\n')
    print(output[output.index('stdout=b'):])

相关问题