Handles von Fenstern ermitteln und deren SystemMenü ändern

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Handles von Fenstern ermitteln und deren SystemMenü ändern

Beitrag von Kiffi »

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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

WH_SHELL-Hook

Beitrag von Kiffi »

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

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
und hier meine Hook-DLL:

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 
Antworten