Registriert seit: 30. Jul 2008
125 Beiträge
|
Re: Eigene Menuitems in taskbar-popup einschleusen
3. Aug 2008, 03:36
Es ist vollendet.
Dieses kleine Progrämmchen wird später mal als Dienst im Hintergrund laufen und Menüerweiterungen bereitstellen.
Momentan fügt es den Systemmenüs den Punkt "Process priority ..." hinzu, der beim Anklicken ein Fenster anzeigt, mit dem man die Prozesspriorität setzen kann ( bei jenem Prozess, dem das Fenster gehört )
http://c.imagehost.org/0652/ppGUI.png
Funktionsprinzip: - es werden beim Starten und alle 2.5 Sekunden bei jenen Systemmenüs, die noch kein selbstdefiniertes Item besitzen, ein "Set Process Priority ..." - Item mit ID $FCC0 hinzugefügt. (Die Standardbuttons rangieren im Bereich $F000-$F120 soweit ich das gesehen habe)
- Die Callback-Prozedur ist in eine dll ausgelagert, diese wird geladen und der Hook mit dem Modulhandle hDLL angesprochen.
- SetWindowsHookEX(WH_SYSMSGFILTER, ...,hDLL) setzt einen Hook, durch den insbesondere die Messages $A08XFXXX laufen, wobei $A080FXXX für MouseEnter in einen aktivierten MenüItem-Eintrag steht. Das Klick-Ereignis führt, wie auch das Bestätigen durch Enter, unter anderem zur $FFFF0000 Message, die ich als "menu close" interpretiere.
- War die zuletzt durch $A08XFXXX festgestellte ID die selbstdefinierte Item ID $FCC0, so wird mit RegisterWindowMessage ein Messagetyp "WM_PROCESSPRIORITYSET_EXT" zum Broadcast registriert und mithilfe von SendMessageTimeout(HWND_BROADCAST, ...) und dieser Message eine Message mit ProcessID und Handle des Prozess-Hauptfensters als WParam und LParam ausgesandt. Ein Aufruf des Hauptprogrammes aus der DLL, welche in diesem Fall vom System genutzt wird, ist mit ShellExecute nicht möglich, da der Programmpfad nicht gespeichert werden kann ( wie auch? Ich sehe hier nur die Möglichkeit, irgendwie an den Pfad des Moduls heranzukommen, wenn überhaupt )
- Das Hauptprogramm startet sich der Einfachheit halber und für mehr Crashsicherheit selbst erneut mit drei Parametern "setpriority <ProcessID> <hwndmainwindow>", wodurch das Formular randlos wird, nur das Steuerpanel anzeigt und sich an die Stelle der Clientfläche des angegebenen Fensters setzt. Die aktuelle priority class wird geladen und in die GUI übernommen. Ein Bestätigen setzt die neue Priorität und schließt das eingeblendete tool.
|
|
Zitat
|