• 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;    
      }    
  • 相关阅读:
    POJ 1182 食物链
    HDU 1385 Minimum Transport Cost
    HDU_2544 最短路
    HDU 2066 一个人的旅行
    poj3090
    poj3157
    poj3169
    poj3125
    poj3187
    VMware Workstation 8的简明使用教程
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1185976.html
Copyright © 2020-2023  润新知