2010-08-24 10 views
18

¿Es posible activar el comportamiento de Windows '"parpadear el botón de la barra de tareas X veces o hasta que la ventana llegue al primer plano" desde un archivo de proceso por lotes? Intento llamar la atención del usuario sobre un script de ejecución larga al finalizar.¿Desencadenar el botón de la barra de tareas desde el archivo por lotes?

Utilizar un programa externo para activar el flasheo está bien, siempre que no requiera una instalación (es decir, el archivo ejecutable se puede incluir con mis scripts).

actualización

Esto es lo que terminó con (un puerto minimalista de código Andreas' Delphi). Lo compilé en MinGW, ya que parece depender solo de KERNEL32.DLL y USER32.DLL, por lo que debería ser muy portátil.

Parpadea tres veces, luego permanece resaltado hasta que aparezca en primer plano.

#define WINVER 0x501 
#define _WIN32_WINNT 0x501 

#include <windows.h> 

void main(int argc, char **argv) { 
    FLASHWINFO info = { sizeof(info), GetConsoleWindow(), FLASHW_TIMERNOFG | FLASHW_TRAY, 3, 0 }; 

    FlashWindowEx(&info); 
} 
+0

¡Una pregunta tan interesante, y solo tres vistas en 45 minutos! –

+0

... y solo 15 visitas en 24 horas. No lo entiendo ... –

+0

Sí, 'GetConsoleWindow' es mucho mejor que' FindWindow' y un título único. No sé por qué no hice eso ... –

Respuesta

5

Es muy fácil hacerlo con un * .exe externo muy simple. Simplemente tiene que llamar a la función FlashWindowEx de la API de Windows.

Este es un ejemplo de aplicación de consola Delphi:

program flashwnd; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, Windows; 

var 
    OldTitle, UniqueTitle: string; 
    h: HWND; 
    c: cardinal; 
    fwi: TFlashWInfo; 

begin 

    try 
    h := GetConsoleWindow(); 

    c := 10; 
    if ParamCount = 1 then 
     c := StrToInt(ParamStr(1)); 

    FillChar(fwi, sizeof(fwi), 0); 
    fwi.cbSize := sizeof(fwi); 
    fwi.hwnd := h; 
    fwi.dwFlags := FLASHW_ALL; 
    fwi.uCount := c; 
    fwi.dwTimeout := 0; 
    FlashWindowEx(fwi); 
    except 
    on E: Exception do 
     Writeln(E.ClassName + ': ' + E.Message); 
    end; 
end. 

lo llamamos simplemente como

flashwnd 

a parpadear la ventana de consola actual diez veces. Llame a

flashwnd 27 

para actualizar la ventana 27 veces.

+0

¡Sospecho que algo como esto sería el caso, pero no tengo esperanzas en las API de Windows! Veré si puedo hacer que esto funcione. –

+0

Finalmente lo tengo trabajando en MinGW (ya que no tengo ningún compilador Delphi a mano). ¡Gracias! –

+0

Hola Ben, ¿hay alguna posibilidad de que tengas la versión compilada de esta utilidad? gracias por adelantado –

Cuestiones relacionadas