Как сделать так, чтобы панель задач моего приложения мигала, как Messenger, когда приходит новое сообщение?

Есть ли в .NET вызов API или встроенная DLL, которую я могу использовать для создания поведения, аналогичного Windows Live Messenger, когда приходит ответ от кого-то, с кем я общаюсь в чате?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
18 125
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Для этого используется API FlashWindowEx Win32. Документация к нему находится по адресу: http://msdn.microsoft.com/en-us/library/ms679347(VS.85).aspx

Доступно только в WinXP, Win2KPro и Vista

Skizz 16.09.2008 18:56

HWND hHandle = FindWindow(NULL,"YourApplicationName");
FLASHWINFO pf;
pf.cbSize = sizeof(FLASHWINFO);
pf.hwnd = hHandle;
pf.dwFlags = FLASHW_TIMER|FLASHW_TRAY; // (or FLASHW_ALL to flash and if it is not minimized)
pf.uCount = 8;
pf.dwTimeout = 75;

FlashWindowEx(&pf);

Украдено у экспертов-обменников gtokas.

FlashWindowEx.

Я думаю, вы ищете SetForegroundWindow.

Доступно во всех ОС Windows, но поведение со временем меняется.

Skizz 16.09.2008 18:57

Из записи в блоге Раймонда Чена:

How do I flash my window caption and taskbar button manually?

How do I flash my window caption and taskbar button manually? Commenter Jonathan Scheepers wonders about those programs that flash their taskbar button indefinitely, overriding the default flash count set by SysteParametersInfo(SPI_SETFOREGROUNDFLASHCOUNT).

The FlashWindowEx function and its simpler precursor FlashWindow let a program flash its window caption and taskbar button manually. The window manager flashes the caption automatically (and Explorer follows the caption by flashing the taskbar button) if a program calls SetForegroundWindow when it doesn't have permission to take foreground, and it is that automatic flashing that the SPI_SETFOREGROUNDFLASHCOUNT setting controls.

For illustration purposes, I'll demonstrate flashing the caption manually. This is generally speaking not recommended, but since you asked, I'll show you how. And then promise you won't do it.

Start with the scratch program and make this simple change:

void
OnSize(HWND hwnd, UINT state, int cx, int cy)
{
  if (state == SIZE_MINIMIZED) {
    FLASHWINFO fwi = { sizeof(fwi), hwnd,
                       FLASHW_TIMERNOFG | FLASHW_ALL };
    FlashWindowEx(&fwi);
  }
}

Compile and run this program, then minimize it. When you do, its taskbar button flashes indefinitely until you click on it. The program responds to being minimzed by calling the FlashWindowEx function asking for everything possible (currently the caption and taskbar button) to be flashed until the window comes to the foreground.

Other members of the FLASHWINFO structure let you customize the flashing behavior further, such as controlling the flash frequency and the number of flashes. and if you really want to take control, you can use FLASHW_ALL and FLASHW_STOP to turn your caption and taskbar button on and off exactly the way you want it. (Who knows, maybe you want to send a message in Morse code.)

Published Monday, May 12, 2008 7:00 AM by oldnewthing Filed under: Code

Ответ принят как подходящий

FlashWindowEx - это то, что вам нужно. См. здесь для документации MSDN

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

[StructLayout(LayoutKind.Sequential)]
public struct FLASHWINFO
{
    public UInt32 cbSize;
    public IntPtr hwnd;
    public UInt32 dwFlags;
    public UInt32 uCount;
    public UInt32 dwTimeout;
}

public const UInt32 FLASHW_ALL = 3; 

Вызов функции:

FLASHWINFO fInfo = new FLASHWINFO();

fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
fInfo.hwnd = hWnd;
fInfo.dwFlags = FLASHW_ALL;
fInfo.uCount = UInt32.MaxValue;
fInfo.dwTimeout = 0;

FlashWindowEx(ref fInfo);

Это было бессовестно подключено от Pinvoke.net

Для приложений WPF установите для fInfo.hwnd значение new System.Windows.Interop.WindowInteropHelper(this).Handle.

user1214135 27.11.2012 00:37

Я использую это в консольном приложении. Он начинает мигать, но как мне заставить его остановиться после щелчка по приложению на панели задач (т. Е. Всякий раз, когда окно находится в фокусе)?

oscilatingcretin 02.07.2013 15:28

@oscilatingcretin, вы можете установить uCount на количество раз, которое вы хотите, чтобы он мигал, это не остановит его мигание, но, по крайней мере, он остановится в конечном итоге. вы также можете изучить использование более простого FlashWindow, которое просто мигает один раз: msdn.microsoft.com/en-us/library/windows/desktop/…

Sounten 03.07.2013 09:17

@dummy, знаете ли вы, как сделать что-то подобное для cmd.exe? Я хочу, чтобы кнопка панели задач cmd.exe мигала после завершения длительного сценария cmd.

Breck 29.07.2014 22:37

@oscilatingcretin, возможно, вы уже догадались об этом, но я все равно добавлю это здесь, если у кого-то еще есть проблема. Вы можете добавить: public const UInt32 FLASHW_TIMERNOFG = 12; fInfo.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG; Это заставит окно перестать мигать, когда окно сфокусировано.

disco 16.06.2016 10:44

Другие вопросы по теме