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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace WindowsDesktop
{
public class Desktop : IDisposable
{
#region DLLs
[DllImport("user32.dll")]
private static extern IntPtr CreateDesktop(string lpszDesktop, IntPtr lpszDevice, IntPtr pDevmode,
int dwFlags, long dwDesiredAccess, IntPtr lpsa);
[DllImport("user32.dll")]
private static extern bool SwitchDesktop(IntPtr hDesktop);
[DllImport("user32.dll", EntryPoint = "CloseDesktop", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseDesktop(IntPtr handle);
[DllImport("user32.dll")]
public static extern bool SetThreadDesktop(IntPtr hDesktop);
[DllImport("user32.dll")]
public static extern IntPtr GetThreadDesktop(int dwThreadId);
[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
#endregion
#region Enumeratoren
[Flags]
internal enum DESKTOP_ACCESS_MASK : uint
{
DESKTOP_NONE = 0,
DESKTOP_READOBJECTS = 0x0001,
DESKTOP_CREATEWINDOW = 0x0002,
DESKTOP_CREATEMENU = 0x0004,
DESKTOP_HOOKCONTROL = 0x0008,
DESKTOP_JOURNALRECORD = 0x0010,
DESKTOP_JOURNALPLAYBACK = 0x0020,
DESKTOP_ENUMERATE = 0x0040,
DESKTOP_WRITEOBJECTS = 0x0080,
DESKTOP_SWITCHDESKTOP = 0x0100,
GENERIC_ALL = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU |
DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK |
DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP),
}
#endregion
#region Dispose
public void Dispose()
{
SwitchToOrginal();
((IDisposable)this).Dispose();
}
/// <summary>
/// Unterklassen können hier die Funktionalität der Objektzerstörung erweitern.
/// </summary>
/// <param name="fDisposing"></param>
protected virtual void Dispose(bool fDisposing)
{
if (fDisposing)
{
// Hier die verwalteten Ressourcen freigeben
//BspVariable1 = null;
CloseDesktop(DesktopPtr);
}
// Hier die unverwalteten Ressourcen freigeben
}
void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); //Fordert das System auf, den Finalizer für das angegebenen Objekt nicht aufzurufen
}
#endregion
#region Variablen
IntPtr _hOrigDesktop;
public IntPtr DesktopPtr;
private string _sMyDesk;
public string DesktopName
{
get
{
return (_sMyDesk);
}
set
{
_sMyDesk = value;
}
}
#endregion
#region Konstruktoren
public Desktop()
{
_sMyDesk = "";
}
public Desktop(string sDesktopName)
{
_hOrigDesktop = GetCurrentDesktopPtr();
_sMyDesk = sDesktopName;
DesktopPtr = CreateMyDesktop();
}
#endregion
#region Methoden
public void show()
{
SetThreadDesktop(DesktopPtr);
SwitchDesktop(DesktopPtr);
}
public void SwitchToOrginal()
{
SwitchDesktop(_hOrigDesktop);
SetThreadDesktop(_hOrigDesktop);
}
private IntPtr CreateMyDesktop()
{
return CreateDesktop(_sMyDesk, IntPtr.Zero, IntPtr.Zero, 0, (long)DESKTOP_ACCESS_MASK.GENERIC_ALL, IntPtr.Zero);
}
public IntPtr GetCurrentDesktopPtr()
{
return GetThreadDesktop(GetCurrentThreadId());
}
#endregion
}
}
|