September 30th, 2013

Playing a sound every time the foreground window changes

Today’s Little Program plays a little sound every time the foreground window changes. One of my colleagues wondered if such a program was possible, “so that I stop accidentally typing the second halves of paragraphs into windows that pop up and steal focus.” It’s not clear whether this program will actually solve the bigger problem, but it was fun writing the program, and maybe you can use it for something.

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

This program installs an accessibility hook that listens for changes to the system foreground. And when it happens, we play a little sound.

I chose the Windows 7 Speech Misrecognition sound because it’s relatively unobtrusive. And the sound is played asynchronously so as not to block the message pump thread. It also has as a pleasant side-effect that if the foreground changes many times rapidly, the new sound will interrupt the old one rather than queueing up behind it.

Note that there is no way to exit this program short of killing it in Task Manager. That’s why it’s a Little Program rather than a real program.

Topics
Code

Author

Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.

0 comments

Discussion are closed.

Feedback