Вызов кнопки панели задач мигает из командного файла - PullRequest
21 голосов
/ 24 августа 2010

Можно ли из пакетного файла запустить Windows "мигать кнопку панели задач X раз или пока окно не выйдет на передний план"? Я пытаюсь привлечь внимание пользователя к длительному сценарию после завершения.

Хорошо использовать внешнюю программу для запуска перепрошивки, если она не требует установки (т.е. исполняемый файл может быть связан с моими сценариями).

Обновление

Вот что у меня получилось (минималистский порт кода 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);
}

1 Ответ

7 голосов
/ 24 августа 2010

Это очень легко сделать с помощью очень простого внешнего * .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 раз.

...