Win32 ターミナルサービスセッションのデスクトップにメッセージボックスを表示する

ターミナルサービスセッションのデスクトップにメッセージボックスを表示するには、WTSSendMessage関数を使う。


  • WTSSendMessage関数のプロトタイプ
  • BOOL WTSSendMessage(
      HANDLE hServer, //ターミナルサーバーのハンドル
      DWORD SessionId, //セッションID
      LPTSTR pTitle, //タイトル
      DWORD TitleLength, //タイトルの長さ(バイト数)
      LPTSTR pMessage, //メッセージ
      DWORD MessageLength, //メッセージの長さ(バイト数)
      DWORD Style, //メッセージボックスのスタイル
      DWORD Timeout, //タイムアウト(bWaitがTRUEのときのみ有効)
      DWORD *pResponse, //ユーザーの応答
      BOOL bWait //TRUEを指定すると、ユーザーが応答するかタイムアウトになるまで制御を戻さない
    );




  • このプログラムを実行中のターミナルサーバー上で、セッションIDが1のセッションにメッセージボックスを表示する
  • #include <windows.h>
    #include <stdio.h>
    #include <wtsapi32.h>
    
    #pragma comment(lib, "wtsapi32.lib")
    
    int main()
    {
        DWORD dwResponse;
        DWORD dwSessionId = 1;
        
        TCHAR szTitle[] = TEXT("Title");
        TCHAR szMessage[] = TEXT("Message");
    
        //bWaitがFALSEなので、ブロッキング状態にはならず、すぐに制御が返る
        WTSSendMessage(
              WTS_CURRENT_SERVER_HANDLE,
              dwSessionId,
              szTitle,
              sizeof(szTitle),
              szMessage,
              sizeof(szMessage),
              MB_OK ,
              0,
              &dwResponse,
              FALSE);
    
        return 0;
    }




  • bWaitをTRUE及びタイムアウトをINFINITEとし、MB_YESNOCANCEL形式のメッセージボックスを表示する。さらに、メッセージボックスに対するユーザーの応答を表示する
  • #include <windows.h>
    #include <stdio.h>
    #include <wtsapi32.h>
    
    #pragma comment(lib, "wtsapi32.lib")
    
    int main()
    {
        DWORD dwResponse;
        BOOL bRet;
        DWORD dwSessionId = 1;
        TCHAR szTitle[] = TEXT("Title");
        TCHAR szMessage[] = TEXT("Message");
    
    
        //bWaitがTRUE、TimeoutがINFINITEなのでユーザーが応答するまで制御が返らない
        bRet = WTSSendMessage(
              WTS_CURRENT_SERVER_HANDLE,
              dwSessionId,
              szTitle,
              sizeof(szTitle),
              szMessage,
              sizeof(szMessage),
              MB_YESNOCANCEL,
              INFINITE,
              &dwResponse,
              TRUE);
    
        
        switch (dwResponse) {
        
        case IDYES:
            puts("IDYES");
            break;
    
        case IDNO:
            puts("IDNO");
            break;
    
        case IDCANCEL:
            puts("IDCANCEL");
            break;
    
        default:
            break;
        }
        
        return 0;
    }



  • リモートPCのターミナルサービスのセッションにメッセージボックスを表示するには、WTSOpenServerでターミナルサーバーのハンドルをオープンする必要がある。
  • #include <windows.h>
    #include <stdio.h>
    #include <wtsapi32.h>
    
    #pragma comment(lib, "wtsapi32.lib")
    
    int main()
    {
        HANDLE hServer;
        DWORD dwResponse;
        BOOL bRet;
        DWORD dwSessionId = 1;
        TCHAR szTitle[] = TEXT("Title");
        TCHAR szMessage[] = TEXT("Message");
        TCHAR szNetBiosName[] = TEXT("リモートPCのNETBIOS名");//リモートPCのNETBIOS名を指定する
    
        hServer = WTSOpenServer(szNetBiosName);
        if (hServer == NULL) {
            return 1;
        }
    
    
        bRet = WTSSendMessage(
              hServer,
              dwSessionId,
              szTitle,
              sizeof(szTitle),
              szMessage,
              sizeof(szMessage),
              MB_YESNOCANCEL,
              INFINITE,
              &dwResponse,
              TRUE);
    
        
        switch (dwResponse) {
        
        case IDYES:
            puts("IDYES");
            break;
    
        case IDNO:
            puts("IDNO");
            break;
    
        case IDCANCEL:
            puts("IDCANCEL");
            break;
    
        default:
            break;
        }
    
        WTSCloseServer(hServer);
        
        return 0;
    }




  • 参考

  • http://msdn.microsoft.com/ja-jp/library/cc429631.aspx