请问,有什么好办法判断系统是处于Winlogon桌面还是用户桌面?

时间:2021-10-24 14:43:34
关于WIN200、XP的登录:
在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 就是你想要的

#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 就是你想要的

#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);

#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);

#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 就是你想要的

#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 就是你想要的

#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);

#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);

#12


mark一下

#13


上面代码只是绑定进程到Winlogon 桌面,还是无法识别系统处于那个桌面,看来是没有好的办法了,结了。

#14


up

#15


呵呵有意思