在系統服務中與案頭進行互動編程實現

來源:互聯網
上載者:User

最進在寫服務端的代碼,裡面用到了FindWindow函數,卻找不到指定視窗,後來才知道服務中不與視窗打交道,要進行桌面視窗互動要用下面的方法來實現,記錄如下,以備後用

int Find()
{
 HWND hWndQQ = NULL;
 HWINSTA hstaSave;
 LPCWSTR lpStation = L"WinSta0";
 LPCWSTR lpDesk = L"default";
 HWINSTA hstaUser;
 
 HDESK hdeskSave;
 HDESK hdeskUser;

 hstaSave = GetProcessWindowStation();
 
    hstaUser = OpenWindowStation(lpStation,0,WINSTA_ALL_ACCESS);
 
 SetProcessWindowStation(hstaUser);

 hdeskSave = GetThreadDesktop(GetCurrentThreadId());

 hdeskUser = OpenDesktop(lpDesk, 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS);
 if (hdeskUser == NULL)
 {
  OutputDebugStringA("Open desktop Failed!");
 
 }
 SetThreadDesktop(hdeskUser);

 ////////////////////////這裡添加與視窗互動的代碼///////////////////////////
 hWndQQ = FindWindow(L"WINDOWAPI", L"WindowAPI");
 if(hWndQQ != NULL)
 {
  OutputDebugStringA("Find Window Success!");
 }
 else
 {
  OutputDebugStringA("Find Window Falied!");
 }

 SetThreadDesktop(hdeskSave);
 SetProcessWindowStation(hstaSave);
 CloseDesktop(hdeskUser);
 CloseWindowStation(hstaUser);
}

 

 

//////////////////////////////參考原文///////////////////////////////////////////////////////

HWINSTA hstaSave = GetProcessWindowStation();
LPCWSTR lpStation = {_T("WinSta0")};
HWINSTA hstaUser = OpenWindowStation(lpStation,0,WINSTA_ALL_ACCESS);
if (hstaUser == NULL)
{
LPCTSTR lpszMsg[] = {_T("Open windowstation Failed!")};
LogEvent(EVENTLOG_INFORMATION_TYPE, MPC_DOGSRV_EXTSVCSHUTDOWN, 1, lpszMsg);
return NULL;
}
SetProcessWindowStation(hstaUser);

HDESK hdeskSave = GetThreadDesktop(GetCurrentThreadId());
LPCWSTR lpDesk = {_T("default")};
HDESK hdeskUser = OpenDesktop(lpDesk, 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS); 
if (hdeskUser == NULL) 
{
LPCTSTR lpszMsg[] = {_T("Open desktop Failed!")};
LogEvent(EVENTLOG_INFORMATION_TYPE, MPC_DOGSRV_EXTSVCSHUTDOWN, 1, lpszMsg);
return NULL; 
}
SetThreadDesktop(hdeskUser);

if (!EnumWindows(EnumWindowsProc, (LPARAM)&wi))
{
LPCTSTR lpszMsg[] = {_T("EnumWindows Failed!")};
LogEvent(EVENTLOG_INFORMATION_TYPE, MPC_DOGSRV_EXTSVCSHUTDOWN, 1, lpszMsg);
}

if (!wi.hWnd) //這裡仍然擷取不到使用者登入介面的視窗。
{
CString strMsg;
strMsg.Format(_T("wi.hWnd is null! ProcessId:%d"),wi.dwProcessId);
LPCTSTR lpszMsg[] = {strMsg};
LogEvent(EVENTLOG_INFORMATION_TYPE, MPC_DOGSRV_EXTSVCSHUTDOWN, 1, lpszMsg);
}

SetThreadDesktop(hdeskSave); 
SetProcessWindowStation(hstaSave);
CloseDesktop(hdeskUser); 
CloseWindowStation(hstaUser);

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.