Hallo,
in der PureArea gibt's hier ein kleines Beispiel, wie man das System-Menü
der eigenen Applikation erweitern kann.
Nun möchte ich gerne dieses Beispiel verwenden, um das System-Menü
aller Fenster (also auch von Fremdanwendungen) zu erweitern.
Mein erster Gedanke ist, via Hook (WM_QUERYOPEN?) zu überwachen,
welche Fenster geöffnet werden, deren Handles zu ermitteln und dann das
System-Menü dieser Fenster zu manipulieren.
Leider finde ich hier, im Archiv und im englischen Forum nur Beispiele, wie
ich einen globalen Keyboard-Hook setzen kann.
Wie kann ich also herausfinden, welche Fenster sich öffnen, während mein
Programm im Hintergrund läuft?
Danke im voraus & Grüße ... Kiffi
Handles von Fenstern ermitteln und deren SystemMenü ändern
WH_SHELL-Hook
ich werd' hier noch bekloppt!
im nachfolgenden Code versuche ich heute schon den ganzen Tag, via
Hook-DLL herauszufinden, wann sich ein Fenster öffnet und wann es wieder
geschlossen wird.
Im Debug-Fenster werden auch tatsächlich Create- und Destroy-Meldungen
ausgegeben. Leider nur nicht zur richtigen Zeit. Ich öffne beispielsweise ein
Fenster und beim Schliesen desselben erscheint 3-mal die
Create(!)-Message.
Wenn ich mit der Maus über die Titelzeile der Form fahre wird andauernd
die Destroy-Message gefeuert.
Die Dokumentationen, die ich zu WH_SHELL gefunden habe,
wiedersprechen sich auch ein wenig. Mal soll ich nCode abfragen, mal
wParam.
Wer kann helfen?
Danke im voraus & Grüße ... Kiffi
und hier meine Hook-DLL:
im nachfolgenden Code versuche ich heute schon den ganzen Tag, via
Hook-DLL herauszufinden, wann sich ein Fenster öffnet und wann es wieder
geschlossen wird.
Im Debug-Fenster werden auch tatsächlich Create- und Destroy-Meldungen
ausgegeben. Leider nur nicht zur richtigen Zeit. Ich öffne beispielsweise ein
Fenster und beim Schliesen desselben erscheint 3-mal die
Create(!)-Message.
Wenn ich mit der Maus über die Titelzeile der Form fahre wird andauernd
die Destroy-Message gefeuert.
Die Dokumentationen, die ich zu WH_SHELL gefunden habe,
wiedersprechen sich auch ein wenig. Mal soll ich nCode abfragen, mal
wParam.
Wer kann helfen?
Danke im voraus & Grüße ... Kiffi
Code: Alles auswählen
#HookDll = 1
myHook.l
Procedure HookProc(Hooked)
Shared myHook
If Hooked = 1
myDLL.l = OpenLibrary(#HookDll,"hook.dll")
myDLLFunction.l = IsFunction(#HookDll,"ShellHook")
myHook = SetWindowsHookEx_(#WH_SHELL, myDLLFunction, myDLL, 0)
Else
UnhookWindowsHookEx_(myHook)
myHook =0
EndIf
EndProcedure
Procedure WindowCallback(WindowID.l, Message.l, wParam.l, lParam.l)
Shared myHook
If myHook > 0
Select wParam
Case #HSHELL_WINDOWCREATED: Debug "WINDOWCREATED: " + Str(WindowID) + " | " + Str(Message) + " | " + Str(wParam) + " | " + Str(lParam)
Case #HSHELL_WINDOWDESTROYED: Debug "WINDOWDESTROYED: " + Str(WindowID) + " | " + Str(Message) + " | " + Str(wParam) + " | " + Str(lParam)
EndSelect
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
OpenWindow(0,250,250,250,250,#PB_Window_SystemMenu,"ShellHookTest")
CreateGadgetList(WindowID())
ButtonGadget(1,10,10,150,30,"Hook aktiv setzen")
SetWindowCallback(@WindowCallback())
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_EventGadget
If EventGadgetID() = 1
If GetGadgetText(1)="Hook inaktiv setzen"
SetGadgetText(1,"Hook aktiv setzen")
HookProc(0)
Else
SetGadgetText(1,"Hook inaktiv setzen")
HookProc(1)
EndIf
EndIf
EndSelect
Until EventID = #PB_EventCloseWindow
HookProc(0)
End
Code: Alles auswählen
ProcedureDLL ShellHook(nCode.l, wParam.l, lParam.l)
If nCode<0
ProcedureReturn CallNextHookEx_(@ShellHook, nCode, wParam, lParam)
EndIf
If wParam = #HSHELL_WINDOWCREATED Or wParam = #HSHELL_WINDOWDESTROYED
WindowName.s = "ShellHookTest"
ID = FindWindow_(#Null,@WindowName)
PostMessage_(ID, nCode, wParam, lParam)
EndIf
ProcedureReturn CallNextHookEx_(@ShellHook, nCode, wParam, lParam)
EndProcedure