從windows服務中開啟視窗進程

來源:互聯網
上載者:User

IVR地方業務中有一個DBA_BJLDNW工具要在伺服器上運行著.一旦斷開業務即中止.需要寫一個精靈監視它,

一旦發現關閉了即重新啟動.

為了防止精靈本身被使用者關閉,所以我打算做一個windows服務在後台運行.每5分鐘列舉一個當前系統進程,如果

沒有發現DBA_BJLDNW.exe則重新啟動.

問題是windows服務不是視窗進程,在這個進程中調用ShellExecute開啟的應用程式也是在後台運行,不能顯示在當前視窗中.

後來搜尋到可以在Windows服務中開啟視窗程序的方法.就是開啟使用者WinSta0和desktop,取得和使用者互動的許可權後再開啟視窗進程,果然可以在windows服務中開啟視窗進程了:

 

  HINSTANCE hProcessSnap = NULL;
 PROCESSENTRY32 pe32 = {0};

 

 //擷取進程的記憶體鏡照
 hProcessSnap = (HINSTANCE) ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 if(hProcessSnap == (HANDLE) -1) return ;
 pe32.dwSize = sizeof(PROCESSENTRY32);

 DWORD flag = 0;
 CString theProcssName = "DBA_BJLDNW.exe";

 //列舉進程

 if(::Process32First(hProcessSnap,&pe32)){
  do{
   if(!theProcssName.CompareNoCase(pe32.szExeFile)){
    flag = 1;
    break;
   }
  }
  while(Process32Next(hProcessSnap,&pe32));
 }
 ::CloseHandle(hProcessSnap);

 if(!flag){ //如果沒有找到

  HDESK   hdeskCurrent;
  HDESK   hdesk;
  HWINSTA hwinstaCurrent;
  HWINSTA hwinsta;

  hwinstaCurrent = GetProcessWindowStation();

  if (hwinstaCurrent == NULL){
   LogEvent(_T("get window station err"));
   return ;
  }

  hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
  if (hdeskCurrent == NULL){
   LogEvent(_T("get window desktop err"));
   return ;
  }

 

  //開啟使用者的winsta0
  hwinsta = OpenWindowStation("winsta0", FALSE,                         
   WINSTA_ACCESSCLIPBOARD   |
   WINSTA_ACCESSGLOBALATOMS |
   WINSTA_CREATEDESKTOP     |
   WINSTA_ENUMDESKTOPS      |
   WINSTA_ENUMERATE         |
   WINSTA_EXITWINDOWS       |
   WINSTA_READATTRIBUTES    |
   WINSTA_READSCREEN        |
   WINSTA_WRITEATTRIBUTES);
  if (hwinsta == NULL){
   LogEvent(_T("open window station err"));
   return ;
  }

  if (!SetProcessWindowStation(hwinsta)){
   LogEvent(_T("Set window station err"));
   return ;
  }

  //開啟desktop
  hdesk = OpenDesktop("default", 0, FALSE,               
   DESKTOP_CREATEMENU |
   DESKTOP_CREATEWINDOW |
   DESKTOP_ENUMERATE    |
   DESKTOP_HOOKCONTROL  |
   DESKTOP_JOURNALPLAYBACK |
   DESKTOP_JOURNALRECORD |
   DESKTOP_READOBJECTS |
   DESKTOP_SWITCHDESKTOP |
   DESKTOP_WRITEOBJECTS);
  if (hdesk == NULL){
   LogEvent(_T("Open desktop err"));
   return;
  }

  SetThreadDesktop(hdesk);  

  ::ShellExecute(0,NULL,"f://ivrtj//DBA//DBA_BJLDNW.exe",NULL,NULL,SW_MAXIMIZE);
  CString msg = "DBA_BJLDNW.exe 被重啟動";
  LogEvent(msg);

  SetProcessWindowStation(hwinstaCurrent);
  SetThreadDesktop(hdeskCurrent);
  CloseWindowStation(hwinsta);
  CloseDesktop(hdesk);
 } 

 

服務安裝後一定要注意,右鍵->屬性->登入,選擇 本地系統帳戶下面的允許服務與案頭互動打勾.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.