ユーザー切り替えに対応する

Winodws XP では、特定のプログラムを起動する際にユーザーを切り替えて、プログラムを実行することが可能になりました。
Windows Vista では、この仕組みが少し変わり、マルチセッションという考え方になりました。
つまり、ユーザーログオンをしたままで、別のユーザーでログオンできるようになりました。
ただ、プログラムによっては、セッションが切り替わってしまうと都合が悪くなるものもあります。
例えば、画面を定期的にリフレッシュするような管理系のアプリケーションは、マルチセッションを意識すべきです。
そこで、今回は、ユーザーセッションの切り替えに対応する方法を紹介します。

  1. メインウィンドウを生成するときに、セッション切り替えメッセージを送信するように登録する
    WTSRegisterSessionNotificationEx()
  2. WM_WTSSESSION_CHANGE メッセージハンドラーを実装する
  3. 通知メッセージの登録を解除する
    WTSUnRegisterSessionNotificationEx()

では、詳細です。

1 について

ウィンドウであれば、WM_CREATE、ダイアログであれば、WM_INITDIALOG で
WTSRegisterSessionNotificationEx() を呼びだします。

MSDN: WTSRegisterSessionNotificationEx()

この第 2 パラメーターで指定したウィンドウハンドルにセッション切り替えが発生したら、通知メッセージが届きます。
なお、XP や 2003 では、WTSRegisterSessionNotification() を使います。

2 について

メッセージハンドラで WPARAM に、どのような切り替えが発生したのかが通知されます。

MSDN: WM_WTSSESSION_CHANGE メッセージ

結構な分解能があるので、必要なものを実装すればよいと思います。

3 について

WTSRegisterSessionNotificationEx() を呼びだしたら、必ず、その解除を行います。

MSDN: WTSUnRegisterSessionNotificationEx()

なお、XP や 2003 では、WTSUnRegisterSessionNotification() を使います。

使い方を簡単に書いておきます。

LRESULT CMainDlg::OnInitDialog(UINT , WPARAM , LPARAM , BOOL& )
{
・・・
    // 通知ウィンドウを登録する
    if (!WTSRegisterSessionNotificationEx(WTS_CURRENT_SERVER, m_hWnd, NOTIFY_FOR_ALL_SESSIONS))
    {
        DWORD dwErr = GetLastError();
        TCHAR szWarning[64];
        wsprintf(szWarning, TEXT(“セッション切り替え通知の登録に失敗しています (%d)”), dwErr);
    }
・・・
}

// MESSAGE_HANDLER(WM_WTSSESSION_CHANGE, OnWtsSessionChange)

LRESULT CMainDlg::OnWtsSessionChange(UINT , WPARAM wParam, LPARAM , BOOL& )
{
    PTSTR pszCode;

    switch (wParam)
    {
    case WTS_CONSOLE_CONNECT:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_CONSOLE_CONNECT”);
        // 何か処理
        break;
    case WTS_CONSOLE_DISCONNECT:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_CONSOLE_DISCONNECT”);
        // 何か処理
        break;
    case WTS_REMOTE_CONNECT:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_REMOTE_CONNECT”);
        // 何か処理
        break;
    case WTS_REMOTE_DISCONNECT:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_REMOTE_DISCONNECT”);
        // 何か処理
        break;
    case WTS_SESSION_LOGON:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_SESSION_LOGON”);
        // 何か処理
        break;
    case WTS_SESSION_LOGOFF:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_SESSION_LOGOFF”);
        // 何か処理
        break;
    case WTS_SESSION_LOCK:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_SESSION_LOCK”);
        // 何か処理
        break;
    case WTS_SESSION_UNLOCK:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:WTS_SESSION_UNLOCK”);
        // 何か処理
        break;
    default:
        pszCode = TEXT(“msg:WM_WTSSESSION_CHANGE wParam:Unknown”);
        pszCode = TEXT(“Unknown”);
    }
    return 0;
}

見てもらうとわかりますが、特別難しい処理ではありません。
こういう些細な機能で、ユーザー満足度って変わってくると思います。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。