我想找到一种方法来检测登录屏幕或UAC是否在我的服务流程中处于活动状态。例如:
现在我查看会话1并检查所有进程,如果我能找到logonui.exe,我认为前两个场景中的任何一个都应该发生。但实际上,这种方法只能检测 场景1.
登录屏幕后仍然存在winlogon.exe。所以我不能使用winlogon.exe作为搜索目标。
根据this链接,我想如果我能找到当前活动(输入)桌面名称,默认,屏幕保护程序或winlogon,我就能解决我的问题。所以我跟着swatkat's回答,我的代码就像这样
HWINSTA hs = GetProcessWindowStation();
HWINSTA hwinsta = OpenWindowStation("winsta0", FALSE, READ_CONTROL | WRITE_DAC);
SetProcessWindowStation(hwinsta);
HDESK hd = OpenInputDesktop(0, TRUE, GENERIC_READ | DESKTOP_READOBJECTS);
if (hd != NULL) {
DWORD size;
GetUserObjectInformation(hd, UOI_NAME, NULL, 0, &size);
TCHAR* name = (TCHAR*)alloca(size + sizeof(TCHAR));
GetUserObjectInformation(hd, UOI_NAME, name, size, &size);
CString result(name);
LOG((CLOG_DEBUG "input desktop name: %s %d", result.c_str(), size));
CloseDesktop(hd);
}
else {
LOG((CLOG_DEBUG "failed to call OpenInputDesktop"));
}
CloseWindowStation(hwinsta);
SetProcessWindowStation(hs);
这似乎总是回归"默认"无论它在哪个屏幕上。
我对Windows桌面和电台并不熟悉,所以如果我做错了,请告诉我。
提前致谢。 杰瑞