在winlogon注册了SAS后,就调用GINA生成3个桌面系统,在用户需要的时候使用,它们分别为:
◇Winlogon 桌面用户在进入登录界面时,就进入了Winlogon桌面。而我们看到的登录对话框,只是GINA负责显示的。如果用户取消以“欢迎屏幕”方式登录,在进入 WindowsXP中任何时候按下“Ctrl-Alt-Delete”,都会激活Winlogon桌面,并显示图5的“Windows安全”对话框。(注意,Winlogon桌面并不等同对话框,对话框只是Winlogon调用其他程序来显示的)
◇用户桌面 用户桌面就是我们日常操作的桌面,它是系统最主要的桌面系统。用户需要提供正确的帐号和密码,成功登录后才能显示“用户桌面”。而且,不同的用户,winlogon会根据注册表中的信息和用户配置文件来初始化用户桌面。
◇ 屏幕保护桌面屏幕保护桌面就是屏幕保护,包括“系统屏幕保护”和“用户屏幕保护”。在启用了“系统屏幕保护”的前提下,用户未进行登录并且长时间无操作,系统就会进入 “系统屏幕保护”;而对于“用户屏幕保护”来说,用户要登录后才能访问,不同的用户可以设置不同的“用户屏幕保护”。
请问,有什么好办法判断系统是处于Winlogon桌面还是用户桌面?
15 个解决方案
#1
MARK,学习一下
#2
好问题,学习
#3
我也想知道
#4
HDESK hDesk = GetThreadDesktop(GetCurrentThreadId());
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
#5
HDESK hDesk = GetThreadDesktop(GetCurrentThreadId());
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
#6
谢谢,不过上面hDesk得到的是本进程的桌面,例如用户进程得到的是用户桌面,如果这时按下CTRL-ALT-DEL锁定系统,系统进入Winlogon 桌面,但是用户进程得到依然是用户桌面,还是无法识别系统处于那个桌面。
#7
明白你的意思了
HDESK hDesk = OpenInputDesktop(0, 0, DESKTOP_ENUMERATE);
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
。。。
CloseDesktop(hDesk);
HDESK hDesk = OpenInputDesktop(0, 0, DESKTOP_ENUMERATE);
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
。。。
CloseDesktop(hDesk);
#8
关注
#9
ok,问题解决了一半。如果是用户进程,处于用户桌面时OpenInputDesktop返回非空,处于Winlogon 桌面时返回NULL;但如果注册成系统服务(身份是system),还是判断不了,OpenInputDesktop的返回取决于“服务是否可以是否允许与桌面交互”这个属性。要么都是NULL(不允许与桌面交互),要么都非空(允许与桌面交互)
#10
gz
#11
系统服务程序的话,默认是工作于Winlogon桌面的吧?
注册服务以后,这样可以获得WinLogon的HDESK
HWINSTA hwinsta = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
SetProcessWindowStation(hwinsta);
HDESK hDesk = OpenDesktop("WinLogon", 0, 0, MAXIMUM_ALLOWED);
注册服务以后,这样可以获得WinLogon的HDESK
HWINSTA hwinsta = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
SetProcessWindowStation(hwinsta);
HDESK hDesk = OpenDesktop("WinLogon", 0, 0, MAXIMUM_ALLOWED);
#12
mark一下
#13
上面代码只是绑定进程到Winlogon 桌面,还是无法识别系统处于那个桌面,看来是没有好的办法了,结了。
#14
up
#15
呵呵有意思
#1
MARK,学习一下
#2
好问题,学习
#3
我也想知道
#4
HDESK hDesk = GetThreadDesktop(GetCurrentThreadId());
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
#5
HDESK hDesk = GetThreadDesktop(GetCurrentThreadId());
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
szDesktopName 就是你想要的
#6
谢谢,不过上面hDesk得到的是本进程的桌面,例如用户进程得到的是用户桌面,如果这时按下CTRL-ALT-DEL锁定系统,系统进入Winlogon 桌面,但是用户进程得到依然是用户桌面,还是无法识别系统处于那个桌面。
#7
明白你的意思了
HDESK hDesk = OpenInputDesktop(0, 0, DESKTOP_ENUMERATE);
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
。。。
CloseDesktop(hDesk);
HDESK hDesk = OpenInputDesktop(0, 0, DESKTOP_ENUMERATE);
DWORD dwLength;
GetUserObjectInformation(hDesk, UOI_NAME, NULL, NULL, &dwLength);
LPTSTR szDesktopName = new TCHAR [dwLength];
GetUserObjectInformation(hDesk, UOI_NAME, szDesktopName, dwLength, &dwLength);
。。。
CloseDesktop(hDesk);
#8
关注
#9
ok,问题解决了一半。如果是用户进程,处于用户桌面时OpenInputDesktop返回非空,处于Winlogon 桌面时返回NULL;但如果注册成系统服务(身份是system),还是判断不了,OpenInputDesktop的返回取决于“服务是否可以是否允许与桌面交互”这个属性。要么都是NULL(不允许与桌面交互),要么都非空(允许与桌面交互)
#10
gz
#11
系统服务程序的话,默认是工作于Winlogon桌面的吧?
注册服务以后,这样可以获得WinLogon的HDESK
HWINSTA hwinsta = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
SetProcessWindowStation(hwinsta);
HDESK hDesk = OpenDesktop("WinLogon", 0, 0, MAXIMUM_ALLOWED);
注册服务以后,这样可以获得WinLogon的HDESK
HWINSTA hwinsta = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
SetProcessWindowStation(hwinsta);
HDESK hDesk = OpenDesktop("WinLogon", 0, 0, MAXIMUM_ALLOWED);
#12
mark一下
#13
上面代码只是绑定进程到Winlogon 桌面,还是无法识别系统处于那个桌面,看来是没有好的办法了,结了。
#14
up
#15
呵呵有意思