2017-03-23 2 views
0

Ich möchte benutzerdefinierte Aktionen zu den Kontextmenüs jeder Titelleiste hinzufügen. Das Ziel besteht darin, eine Option wie in der Aufgabenansicht hinzuzufügen, in der Sie ein Fenster auf einen anderen virtuellen Desktop verschieben können. Ich konnte dies mit Hotkeys tun, die GlobalHotKey- und WindowsDesktop-Pakete in C# verwenden. Aber ich möchte es in der Benutzeroberfläche ähnlich wie einige Linux-Desktop-Umgebungen tun.Benutzerdefinierte Titelleiste Kontextmenüaktionen

Ich weiß, dass Sie dies normalerweise nicht mit der Registrierung tun können, wie Sie mit anderen Kontextmenüs können. Bei der Erstellung Ihrer eigenen Anwendung weiß ich, dass Sie GetSystemMenu, AppendMenu usw. verwenden können, und übersteuern Sie WndProc, um damit umzugehen. Aber das wird offensichtlich nicht für das funktionieren, was ich beabsichtige.

Die Anwendung Moo0 Fenster-Menü plus erzielt den gewünschten Effekt, aber ich habe keine Ahnung, wie sie es tun.

Ich habe eine Lösung, die das Gefühl wohl etwas hacky, aber ich würde noch gerne wissen, wie es getan werden könnte. Ich bin offen für jede Sprache, um dies zu erreichen.

Antwort

1

Sie müssen in den Prozess injizieren, das ist der einzige Weg, um einen Menüpunkt hinzuzufügen.

Eine Shell hook benachrichtigt Sie mit HSHELL_WINDOWCREATED, wenn ein entsprechendes Fenster erstellt wurde. Sie können dann in den Prozess injizieren (mit einem anderen Hook-Typ oder CreateRemoteThread). Sobald Sie Ihre .DLL im Prozess haben, können Sie das Fenster unterklassifizieren und das Systemmenü ändern.

Sie müssen sowohl eine 32-Bit- und 64-Bit-Injektion DLL erstellen und ich würde empfehlen, dass Sie es in nativen Code zu schreiben, nicht C#.