zoukankan      html  css  js  c++  java
  • 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;    
      }    
  • 相关阅读:
    【luogu】P1772物流运输(最短路+DP)
    【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)
    后记
    【Luogu】P2680运输计划(树上差分+二分)
    【Luogu】P2059卡牌游戏(概率DP)
    【Luogu】P2051中国象棋(DP)
    概率与期望学习笔记
    【Luogu】P2894酒店Hotel(线段树)
    21.Mysql Server优化
    20.Mysql锁机制
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1185976.html
Copyright © 2011-2022 走看看