最进在写服务端的代码,里面用到了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);