Звуковой сигнал при смене активного окна


Автор: Рэймонд Чен.
Оригинал статьи: Playing a sound every time the foreground window changes.

Сегодняшняя программка проигрывает звук при смене активного окна. Один из моих коллег интересовался, возможно ли написать такую программу, «чтобы я перестал набирать вторую половину абзаца в окне, которое внезапно появилось и перехватило фокус.» Непонятно, решит ли эта программа большую проблему, но писать её было приятно. Может, и вам она пригодится для чего-нибудь.

#define STRICT
#include <windows.h>
#include <mmsystem.h>

void CALLBACK WinEventProc(
    HWINEVENTHOOK hWinEventHook,
    DWORD event,
    HWND hwnd,
    LONG idObject,
    LONG idChild,
    DWORD dwEventThread,
    DWORD dwmsEventTime
)
{
  if (hwnd &&
      idObject == OBJID_WINDOW &&
      idChild == CHILDID_SELF &&
      event == EVENT_SYSTEM_FOREGROUND) {
   PlaySound(TEXT("C:\\Windows\\Media\\Speech Misrecognition.wav"),
             NULL, SND_FILENAME | SND_ASYNC);
 }
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev,
                   LPSTR lpCmdLine, int nShowCmd)
{
  HWINEVENTHOOK hWinEventHook = SetWinEventHook(
     EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND,
     NULL, WinEventProc, 0, 0,
     WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);

  MSG msg;
  while (GetMessage(&msg, NULL, 0, 0)) {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }

  if (hWinEventHook) UnhookWinEvent(hWinEventHook);

  return 0;
}

Эта программа реагирует на событие смены активного окна. Когда активное окно меняется, мы проигрываем короткий звук.

Я выбрал звук Windows 7 «Распознавание речи — неудача», потому что он сравнительно ненавязчивый. Звук проигрывается асинхронно, чтобы не блокировать поток сообщений. Дополнительная приятная особенность: если активное окно быстро меняется несколько раз, новый звук прерывает старый, а не дожидается окончания его воспроизведения.

Учтите, что завершить программу можно лишь с помощью Диспетчера задач. Это ведь маленькая программка, а не настоящая программа.

Реклама
Запись опубликована в рубрике перевод, программирование с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s