Haga que Win32 MessageBox aparezca sobre otros progtwigs

Recientemente comencé a aprender Python y escribí un pequeño script que me informa cuando un determinado sitio web cambia el contenido. Luego lo agregué como una tarea progtwigda a Windows para que pueda ejecutarse cada 10 minutos. Me gustaría que me informen de que el sitio web está cambiando de inmediato, por lo que agregué un Win32ui MessageBox que aparece si el script detecta que el sitio ha cambiado. Aquí está el pequeño fragmento de código que estoy usando para el MessageBox (texto imaginativo, lo sé):

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

Mi problema es que paso la mayor parte del tiempo usando el escritorio remoto, de modo que cuando el MessageBox se abre y se ubica detrás de la sesión del escritorio remoto, ¿hay alguna forma de forzar que el MessageBox aparezca encima?

En una nota similar, cuando el script se ejecuta, la línea de comandos se abre brevemente en la sesión de escritorio remoto que no quiero, ¿hay alguna forma de detener este comportamiento?

Estoy contento con las soluciones específicas de Windows, ya que soy consciente de que podría significar tratar con el administrador de ventanas o posiblemente una forma alternativa de informarme en lugar de usar un MessageBox.

Cuando inicia algo desde el Progtwigdor de tareas, Windows bloquea cualquier forma ” fácil ” de colocar sus ventanas o cuadros de diálogo en la parte superior.

  1. Primera forma: use el MB_SYSTEMMODAL (4096 valor). En mi experiencia, hace que el diálogo Msg “Siempre arriba”.

     win32ui.MessageBox("The website has changed.", "Website Change", MB_SYSTEMMODAL) 
  2. Segunda forma: intente traer su consola / ventana / diálogo al frente con las siguientes llamadas. Por supuesto, si usa MessageBox , debe hacerlo (para su propia ventana creada) antes de llamar a MessageBox .

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

En cuanto al parpadeo de la ventana de la consola, puede intentar iniciar Python en un estado oculto. Por ejemplo, use ConEmu , ‘HidCon’ o cmdow . Consulte sus parámetros, algo como:

 ConEmu -basic -MinTSA -cmd C:\Python27\python.exe C:\pythonScript.py or CMDOW /RUN /MIN C:\Python27\python.exe C:\pythonScript.py 

Evitar el flash de la ventana de comandos se hace nombrando el script con una extensión pyw lugar de simplemente py . También puede usar pythonw.exe lugar de python.exe , realmente depende de sus requisitos.

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

Use ctypes, muestra un cuadro de mensaje de error de Windows muy fácil de usar,

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

Hacer que el sistema de buzones de mensajes sea modal hará que aparezca sobre todas las aplicaciones, pero ninguna puede interactuar hasta que se cierre. Considere la posibilidad de crear una ventana de cuadro de diálogo personalizada que pueda traer al frente o usar una burbuja de notificación en su lugar.

Windows intenta dificultar que aparezca una ventana sobre la aplicación activa. Los usuarios lo encuentran molesto, especialmente porque la ventana de interrupción generalmente roba el foco del teclado.

La forma en que Windows da una notificación como esta es con un globo en el área de notificación en lugar de un cuadro de mensaje. Los globos de notificación no roban el foco y distraen (supuestamente).

No estoy seguro de si la biblioteca de la interfaz de usuario de Windows de Python ofrece envoltorios para globos de notificación .

Esto funciona para mí:

 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) 

Uso:

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