UAC Escalation Notification

Windows Vista でユーザー アカウントを超える操作 (例えばインストールや管理者として実行) を行おうとすると、デスクトップが暗くなって、UAC (User Account Control) エスカレーション ダイアログが表示されます。このダイアログが表示されることをアプリケーションから知りたいときは、次のように SetWinEventHook でイベントとコールバックを指定します。

  SetWinEventHook(
          EVENT_SYSTEM_DESKTOPSWITCH,
          EVENT_SYSTEM_DESKTOPSWITCH,
          NULL,
          WinEventCallback,
          0, 
          0,
          WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNTHREAD);

...

VOID CALLBACK WinEventCallback(
          HWINEVENTHOOK hWinEventHook,
          DWORD event,
          HWND hwnd,
          LONG idObject, 
          LONG idChild,
          DWORD dwEventThread, 
          DWORD dwmsEventTime)
{
     switch( event )
     {
          case EVENT_SYSTEM_DESKTOPSWITCH:
               MessageBox(hwnd, TEXT("EVENT_SYSTEM_DESKTOPSWITCH"), NULL, MB_OK );
               break;
     }

}

ここで注意が必要なのは、EVENT_SYSTEM_DESKTOPSWITCH は Windows Vista でしか使えないので、次のようにバージョンを宣言する必要があります。

#define _WIN32_WINNT 0x0600

EVENT_SYSTEM_DESKTOPSWITCH は WinUser.h で次のように宣言されているからです。

#if(_WIN32_WINNT >= 0x0600)
#define EVENT_SYSTEM_DESKTOPSWITCH      0x0020
#endif /* _WIN32_WINNT >= 0x0600 */