从批处理文件触发任务栏按钮闪烁?

发布于 2024-09-16 00:18:36 字数 605 浏览 8 评论 0原文

是否可以从批处理文件触发 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);
}

Is it possible to trigger Windows' "flash the task bar button X times or until the window comes to the foreground" behavior from a batch file? I'm trying to call the user's attention to a long-running script upon completion.

Using an external program to trigger the flashing is fine, as long as it doesn't require an install (i.e. the executable can be bundled with my scripts).

Update

Here's what I ended up with (a minimalist port of Andreas' Delphi code). I've compiled it under MinGW at it appears to be dependent only on KERNEL32.DLL and USER32.DLL, so should be highly portable.

Flashes three times, then stays highlighted until brought to the foreground.

#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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只有一腔孤勇 2024-09-23 00:18:36

使用非常简单的外部 *.exe 即可轻松完成。它只需调用 FlashWindowEx Windows API 的函数。

这是一个示例 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.

只需调用它即可

flashwnd

闪烁当前控制台窗口十次。调用

flashwnd 27

闪窗27次。

It is very easy to do using a very simple external *.exe. It simply has to call the FlashWindowEx function of the Windows API.

This is a sample Delphi console application:

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.

Simply call it like

flashwnd

to flash the current console window ten times. Call

flashwnd 27

to flash the window 27 times.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文