2010-08-24 83 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