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;    
  }    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值