2008-09-25 4 views
23

Vor einigen Jahren habe ich unschuldig versucht, eine kleine App zu schreiben, um meine taktisch platzierten Desktop-Icons zu speichern, weil ich es satt hatte, sie zurück zu ihren Orten zu ziehen, wenn ein Event sie zurückgesetzt hat. Ich habe aufgegeben, nachdem ich zu viel Zeit verbracht habe, weil ich keine Möglichkeit gefunden hatte, die Desktop-Position meiner Icons abzufragen, geschweige denn zu speichern und zurückzusetzen.Wie programmiere ich Windows-Desktop-Symbolpositionen?

Wer weiß, wo Windows diese Informationen hält und ob es eine API gibt, um sie zu setzen?

Danke, Richard

Antwort

10

Wenn ich mich nicht irre, ist der Desktop nur ein ListView, und Sie müssen die LVM_SETITEMPOSITION Nachricht an das Handle des Desktops senden.

Ich googelte ein wenig für einige C# -Code und konnte kein Beispiel finden, aber ich habe den folgenden Artikel gefunden. Torry: ...get/set the positions of desktop icons?. Es ist Delphi-Code, aber ich finde es sehr lesbar und mit einigen P/Invokes können Sie es in C# übersetzen.

+0

Ich fing an, diesen Code als Basis zu verwenden, aber während ich dann etwas von ihm googelte, fand ich den Link, den ich als Antwort gepostet habe, also werde ich dir die Antwort gutschreiben, danke. – ZeroBugBounce

+0

Diese Links scheint wie Müll jetzt ... –

0

ich keine Ahnung über die API, aber ich weiß, Ultramon (http://www.realtimesoft.com/ultramon/) hat eine Funktion für die Erhaltung Symbol Platzierung enthalten (obwohl ich es nie Symbol Standort für die Erhaltung verwendet haben, ist es unverzichtbar für die Verwendung mehrerer Bildschirme). Die neueste Beta-Version funktioniert tadellos mit Vista (außer manchmal mit ein oder zwei kleine Fehler beim ersten Einloggen in meinem Rechner über RDP), und natürlich, hatte keine Probleme mit XP. Ich benutze es seit über vier Jahren.

Und habe ich erwähnt, dass es das beste Dienstprogramm für die Verwendung mehrerer Bildschirme ist?

2

Der Desktop ist nur ein ListView-Steuerelement, und Sie können seinen Handle abrufen und Nachrichten senden, um Symbole mithilfe von LVM_SETITEMPOSITION zu verschieben.

Die Icon-Positionen mit LVMGETITEMPOS zu bekommen ist etwas komplizierter. Sie müssen einen Zeiger auf eine POINT-Struktur als Ihre LPARAM übergeben. Wenn Sie das versuchen, wird der Explorer wahrscheinlich zum Absturz gebracht. Das Problem ist, dass Sie ihm einen Zeiger in Ihrem Adressraum übergeben, den das Steuerelement als einen Zeiger im Adressraum des Explorers interpretiert. Autsch!

Die Lösung, die ich verwendet habe, ist eine DLL in den Explorer-Prozess zu injizieren und die Nachricht von dort zu senden. Dann müssen Sie nur einen Weg haben, um die Positionsinformationen in Ihren Prozess zurück zu bekommen.

+2

Beachten Sie, dass Sie möglicherweise nicht brauchen, um eine DLL zu injizieren: Sie können die Nachricht von out of proc senden und VirtualAllocEx und Read/WriteProcessMemory verwenden, um den Speicher im Explorer Prozessraum einzurichten, damit Sie einen gültigen LPARAM-Zeiger (aus Sicht des Explorers) verwenden können. Auf diese Weise können Sie nicht mit Ihrem eigenen Prozess kommunizieren oder mit einer separaten DLL arbeiten. – BrendanMcK

Verwandte Themen