2010-08-24 62 views
18

是否可以從批處理文件中觸發Windows'「將任務欄按鈕閃爍X次或直到窗口到達前臺」行爲?我試圖在完成時呼籲用戶注意長時間運行的腳本。從批處理文件觸發任務欄按鈕閃存?

只要不需要安裝(即可執行文件可以與我的腳本捆綁在一起),使用外部程序觸發閃爍就沒問題。

更新

這裏是我結束了(的Andreas' Delphi代碼簡約的端口)。我已經在MinGW下編譯它,它似乎只依賴於KERNEL32.DLL和USER32.DLL,所以應該是高度可移植的。

閃爍三次,然後保持突出顯示狀態直到前景。

#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

這樣一個有趣的問題,在45分鐘內只有三個意見?! – 2010-08-24 19:43:48

+0

...並且在24小時內只能觀看15次。我不明白... – 2010-08-25 17:26:54

+0

是的,'GetConsoleWindow'比'FindWindow'好一個獨特的標題。不知道爲什麼我沒有那樣做... – 2010-08-25 18:01:14

回答

5

使用非常簡單的外部* .exe很容易。它只需調用Windows API的FlashWindowEx函數。

這是一個示例德爾福控制檯應用程序:

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. 

簡單地這樣稱呼它

flashwnd 

閃爍當前控制檯窗口十倍。致電

flashwnd 27 

使窗口閃爍27次。

+0

我懷疑這樣的情況會是這樣,但在Windows APIs絕望!我會看看我能否得到這個工作。 – 2010-08-24 22:05:04

+0

最後讓它在MinGW中工作(因爲我沒有Delphi編譯器)。謝謝! – 2010-08-25 17:31:59

+0

嗨本,任何機會,你有這個工具的編譯版本?提前致謝 – 2011-12-22 14:56:09