在系统服务中与桌面进行交互编程实现

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值