-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathOpenDesktop.cpp
More file actions
104 lines (82 loc) · 2.69 KB
/
OpenDesktop.cpp
File metadata and controls
104 lines (82 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include ".\opendesktop.h"
#include "stdio.h"
#include "atlbase.h"
COpenDesktop::COpenDesktop()
{
_OpenDesktop();
}
COpenDesktop::COpenDesktop(LPCWSTR szName)
{
_OpenDesktop(szName);
}
COpenDesktop::~COpenDesktop(void)
{
_CloseDesktop();
}
BOOL COpenDesktop::_OpenDesktop(LPCWSTR szName)
{
WCHAR pvInfo[128] = {0};
if(szName != NULL)
lstrcpy(pvInfo, szName);
else
{
HDESK hActiveDesktop;
DWORD dwLen;
hActiveDesktop = OpenInputDesktop(DF_ALLOWOTHERACCOUNTHOOK, FALSE, MAXIMUM_ALLOWED);
GetUserObjectInformation(hActiveDesktop, UOI_NAME, pvInfo, sizeof(pvInfo), &dwLen);
CloseDesktop(hActiveDesktop);
}
m_hwinstaCurrent = GetProcessWindowStation();
if (m_hwinstaCurrent == NULL){
return FALSE;
}
m_hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (m_hdeskCurrent == NULL){
return FALSE;
}
//´ò¿ªwinsta0
m_hwinsta = OpenWindowStation(_T("winsta0"), FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (m_hwinsta == NULL){
return FALSE;
}
if (!SetProcessWindowStation(m_hwinsta)){
return FALSE;
}
//´ò¿ªdesktop
m_hdesk = OpenDesktop(pvInfo, 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (m_hdesk == NULL){
return FALSE;
}
SetThreadDesktop(m_hdesk);
return TRUE;
}
BOOL COpenDesktop::_CloseDesktop()
{
if (!SetProcessWindowStation(m_hwinstaCurrent))
return FALSE;
if (!SetThreadDesktop(m_hdeskCurrent))
return FALSE;
if (!CloseWindowStation(m_hwinsta))
return FALSE;
if (!CloseDesktop(m_hdesk))
return FALSE;
return TRUE;
}