最進在寫服務端的代碼,裡面用到了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);