4

私は最近Pythonの学習を開始し、特定のWebサイトがコンテンツを変更したときに通知する小さなスクリプトを作成しました。次に、それをスケジュールされたタスクとしてWindowsに追加し、10分ごとに実行できるようにしました。ウェブサイトが変更されたことをすぐに通知したいので、スクリプトがウェブサイトの変更を検出した場合にポップアップするwin32uiメッセージボックスを追加しました。これが私がMessageBoxに使用している小さなコードスニペットです(想像上のテキスト、私は知っています):

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

私の問題はこれです。ほとんどの時間をリモートデスクトップを使用しているので、MessageBoxがポップアップしたときに、リモートデスクトップセッションの後ろに配置されます。MessageBoxを強制的にその上に表示する方法はありますか?

同様に、スクリプトを実行すると、コマンドラインがリモートデスクトップセッション上で非常に短時間開きますが、これは望ましくありませんが、この動作を停止する方法はありますか?

私は、Windows固有のソリューションに満足しています。これは、メッセージボックスを使用するのではなく、ウィンドウマネージャーまたはおそらく別の方法で通知することを意味する可能性があることを認識しています。

4

7 に答える 7

8

タスクスケジューラから何かを開始すると、Windowsはウィンドウやダイアログを一番上に表示する「簡単な」方法をブロックします。

  1. 最初の方法- MB_SYSTEMMODAL(4096値)フラグを使用します。私の経験では、Msgダイアログは「常に上」になります。

    win32ui.MessageBox("The website has changed.", "Website Change", MB_SYSTEMMODAL)
    
  2. 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の方法は、メッセージボックスではなく、通知領域にバルーンを使用することです。通知バルーンはフォーカスを奪うことはなく、(おそらく)気を散らすものではありません。

PythonWindowsUIライブラリが通知バルーンのラッパーを提供しているかどうかはわかりません。

于 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 に答える