NT Service与桌面交互

普通的service程序不能和用户交互是因为其desktop和正常的desktop不同。只要把service的desktop切换成正常desktop,就可以交互了。下面是msdn上的示范代码:  
   
   
  DWORD   dwGuiThreadId   =   0;    
     
  int    
  UserMessageBox(    
          RPC_BINDING_HANDLE   h,    
          LPSTR   lpszWindowStation,    
          LPSTR   lpszDesktop,    
          LPSTR   lpszText,    
          LPSTR   lpszTitle,    
          UINT   fuStyle)    
  {    
          DWORD   dwThreadId;    
          HWINSTA   hwinstaSave;    
          HDESK   hdeskSave;    
          HWINSTA   hwinstaUser;    
          HDESK   hdeskUser;    
          int   result;    
     
          //   Ensure   connection   to   service   window   station   and   desktop,   and    
          //   save   their   handles.    
   
          GetDesktopWindow();    
          hwinstaSave   =   GetProcessWindowStation();    
          dwThreadId   =   GetCurrentThreadId();    
          hdeskSave   =   GetThreadDesktop(dwThreadId);    
     
          //   Impersonate   the   client   and   connect   to   the   User's    
          //   window   station   and   desktop.    
   
          RpcImpersonateClient(h);    
          hwinstaUser   =   OpenWindowStation(lpszWindowStation,   FALSE,   MAXIMUM_ALLOWED);    
          if   (hwinstaUser   ==   NULL)    
          {    
                  RpcRevertToSelf();    
                  return   0;    
          }    
          SetProcessWindowStation(hwinstaUser);    
          hdeskUser   =   OpenDesktop(lpszDesktop,   0,   FALSE,   MAXIMUM_ALLOWED);    
          RpcRevertToSelf();    
          if   (hdeskUser   ==   NULL)    
          {    
                  SetProcessWindowStation(hwinstaSave);    
                  CloseWindowStation(hwinstaUser);    
                  return   0;    
          }    
          SetThreadDesktop(hdeskUser);    
     
          //   Display   message   box.    
   
          dwGuiThreadId   =   dwThreadId;    
          result   =   MessageBox(NULL,   lpszText,   lpszTitle,   fuStyle);    
          dwGuiThreadId   =   0;    
     
          //   Restore   window   station   and   desktop.    
   
          SetThreadDesktop(hdeskSave);    
          SetProcessWindowStation(hwinstaSave);    
          CloseDesktop(hdeskUser);    
          CloseWindowStation(hwinstaUser);    
     
          return   result;    
  }    
posted @ 2008-05-06 23:33  Max Woods  阅读(584)  评论(0编辑  收藏  举报