2012-04-04 2 views
3

Ich erstelle ein Desktop-Gadget und stehe vor Problemen. Das Fenster wird durch den Befehl "Desktop anzeigen" ausgeblendet - STOP, ich weiß, was du denkst und brauche keine "Du solltest das nicht tun" Kommentare - und ich möchte es stoppen. Der springende Punkt eines Desktop-Gadgets ist schließlich, dass es auf dem Desktop klebt.Fenster durch "Desktop anzeigen" sichtbar machen/Win + D

Nur um zu verdeutlichen - ich will kein TopMost-Fenster. Ich möchte den Befehl "Desktop anzeigen" nicht beenden, sondern einfach ignorieren. Alles, was ich will, ist, dass mein Desktop-Gadget auf dem Desktop sichtbar bleibt und so wenig normale Funktionalität wie üblich stört.

Irgendwelche Ideen? Meine aktuelle Methode ist ein P/Invoke-Snippet, das ich bei Google gefunden habe, wobei die Eltern des Formulars auf Progman oder etwas anderes gesetzt werden. Problem ist, dass dies das Fenster in der Taskleiste zu erzwingen scheint, was ich nicht möchte.

+0

Also, wenn der Benutzer auf "Desktop anzeigen" klickt, wird Ihr Gadget ausgeblendet? Es klingt für mich plausibel, dass das nicht passieren soll, da sich die integrierten Gadgets nicht verstecken, wenn ich auf den Desktop klicke. Ist das ein "echtes" Gadget? Ich dachte, sie wären HTML, aber Sie erwähnen die besten Formulare ... –

+0

Es ist eine Winforms App. Ich habe ursprünglich versucht, ein "sidebar"/Desktop-Gadget zu erstellen, aber ich fühle mich viel wohler bei der Verwendung von C#, ich konnte auch nicht so aussehen, wie ich es möchte, egal wie sehr ich mich mit Stylesheets und sowas beschäftigt habe. Ich gab es auf und beschloss, mein eigenes unabhängiges Gadget zu machen. – robhol

+0

Ich denke nicht, Winforms ist der Weg zu gehen für das, was Sie erreichen wollen. besser weg mit HTML – nawfal

Antwort

6

Vielleicht ein bisschen spät für eine Antwort auf Ihre Frage, aber dennoch hier die Antwort, die ich scheinen gefunden zu haben:

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)] 
    static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC, string sW); 

    void MakeWin() 
    { 
     IntPtr nWinHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null); 
     nWinHandle = FindWindowEx(nWinHandle, IntPtr.Zero, "SHELLDLL_DefView", null); 
     SetParent(Handle, nWinHandle); 
    } 

„MakeWin“ sollte im Konstruktor des Formulars aufgerufen werden, am besten vor "Initialisieren der Komponente". Funktioniert gut für mich zumindest unter Win7.

+0

vermeidet dies das Problem des OP, das das Fenster in der Taskleiste anzeigt? – Emile

+1

ja :) Es zeigt kein Taskleistensymbol. Aber bis jetzt habe ich ein anderes Problem: das Fenster kann nicht über anderen (normalen) Fenstern erscheinen. Ich denke, Grund von beiden ist, weil es ein untergeordnetes Fenster des "SHELLDLL_DefView" geworden ist. Ich experimentiere nur mit dem "WS_POPUP" -Stil. –

+0

Dies scheint in Windows 10 nicht zu funktionieren, wie in http://stackoverflow.com/q/35045060/2551829 erwähnt. Ich verstehe nicht wirklich, was Ihr Code tut genug, um zu versuchen, dieses Konzept zu bauen, um es am 10. arbeiten zu lassen. Wissen Sie, wie man es ändert, damit es in Windows 10 funktioniert? – DeadEli

Verwandte Themen