Как заставить панель задач мигать в моем приложении, как в Messenger, когда приходит новое сообщение?
Есть ли вызов API в.NET или нативная DLL, которую я могу использовать для создания поведения, аналогичного Windows Live Messenger, когда приходит ответ от кого-то, с кем я общаюсь?
5 ответов
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
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);
Похищен у экспертов-членов биржи гтокас.
Из записи в блоге Рэймонда Чена:
Как вручную прошить заголовок окна и кнопку на панели задач?
Как вручную прошить заголовок окна и кнопку на панели задач? Комментатор Джонатан Шиперс удивляется тем программам, которые бесконечно мигают на панели задач, переопределяя счетчик флэш-памяти по умолчанию, установленный SysteParametersInfo(SPI_SETFOREGROUNDFLASHCOUNT).
Функция FlashWindowEx и ее более простой предшественник FlashWindow позволяют программе мигать заголовком окна и кнопкой на панели задач вручную. Диспетчер окон мигает заголовок автоматически (и Explorer следует заголовок, мигая кнопку панели задач), если программа вызывает SetForegroundWindow, когда у нее нет разрешения на передний план, и это автоматическое мигание контролируется настройкой SPI_SETFOREGROUNDFLASHCOUNT.
Для наглядности я покажу, как прошивать заголовок вручную. Вообще говоря, это не рекомендуется, но так как вы спросили, я покажу вам, как. А потом обещай, что не сделаешь этого.
Начните с нуля и внесите эти простые изменения:
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); } }
Скомпилируйте и запустите эту программу, затем сверните ее. Когда вы это сделаете, кнопка панели задач будет мигать бесконечно, пока вы не нажмете на нее. Программа реагирует на сворачивание, вызывая функцию FlashWindowEx, запрашивая все возможные варианты (в настоящее время кнопка заголовка и панели задач), пока окно не выходит на передний план.
Другие члены структуры FLASHWINFO позволяют дополнительно настраивать режим мигания, например контролировать частоту вспышек и количество вспышек. и если вы действительно хотите взять управление на себя, вы можете использовать FLASHW_ALL и FLASHW_STOP, чтобы включать и отключать кнопку заголовка и панели задач именно так, как вы этого хотите. (Кто знает, может быть, вы хотите отправить сообщение азбукой Морзе.)
Опубликовано в понедельник, 12 мая 2008 г., 7:00 по oldnewthing. Подано в: Код
FlashWindowEx Win32 API - это вызов, используемый для этого. Документация для этого находится по адресу: http://msdn.microsoft.com/en-us/library/ms679347(VS.85).aspx