Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1562 | Anzahl registrierter User: 1893 | Besucher online: 75
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Desktop Klasse (CreateDesktop)


Autor: Krzysztof
Sprache: C#
Bewertung:
8.2 (6 votes)
Anzahl der Aufrufe: 6892
  
Kick it on dotnet-kicks.de  

Beschreibung:

ich bin dabei eine Desktop Class zu schreiben.
Und das ist Version 1 davon

Am Ende möchte ich zwischen mehreren Desktops umschalten (wie bei Linux)

Using:
using System.Runtime.InteropServices;


Abgelegt unter: desktop, class, Runtime, InteropServices, CreateDesktop, umschalten, Switch, SwitchDesktop, CloseDesktop, IntPtr, SetThreadDesktop, kryssi, mehrere Desktops.



C#
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

    }
}


Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Krzysztof schrieb am:  02.11.2009 22:27:30

Aufruf Beispiel:


Desktop myDesk = new Desktop("MeinTestDesktop");
System.Threading.Thread.Sleep(1000);
Application.DoEvents();
myDesk.show();
Application.DoEvents();
System.Threading.Thread.Sleep(3000);
myDesk.SwitchToOrginal();
Application.DoEvents();
myDesk.Dispose();

Leonardo schrieb am:  02.11.2009 22:31:15


da ist ja NIX drauf.
aber von mir gibt es eine 10
Krzysztof schrieb am:  03.11.2009 11:54:00

danke,
die nächste version kann Prozesse starten
Krzysztof schrieb am:  03.11.2009 11:57:05

bitte mein Snippet bewerten.
konstruktive Kritik und Vorschläge sind auch erwünscht :-)
Lassi schrieb am:  05.11.2009 22:03:42

Abend,

schöne Sache was du da gemacht hast
also von mir gibt es 10 Punkte!

Ich weis nicht vielleicht hab ichs übersehen aber des Desktop wird doch auf dem selben Kern wie die Anwendung gestartet oder?
Wenn ja kannste das ja einbauen wenn mehrer Desktops gestartet werden das diese verteilt werden.

gruß Lassi
Krzysztof schrieb am:  05.11.2009 23:13:17

hi,

danke für deine Bewertung Lassi.
ja das ist echt ne gute Idee
das kommt auf meine Liste
Krzysztof schrieb am:  05.11.2009 23:17:18

Momentan versuche ich Windoof dazu überreden, dass meine Anwendung automatisch von Desktop zu Desktop mit kommt. Aber die ist stur und erscheint überall aber leider nicht auf meinem neuen Desktop.
Hat einer eine Idee?
Timo Pijnappel schrieb am:  15.11.2009 15:45:51

An diesem Problem habe ich auch schon mal gearbeitet. Die Desktop API hat da aber einige Fallstricke. Besonders seit Vista...

Ich habe das damals so gemacht, dass ich die Listen der aktiven Fenster manuell verwaltet habe und die Fenster je nach Benutzerauswahl angezeigt oder versteckt habe. Das erleichtert auch das verschieben von Fenstern auf andere Desktops.

Hauptsächlich habe ich dafür EnumWindows und ShowWindow genutzt.


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.