Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie erkennen, wann System-Menü eines Fensters geöffnet wird? (https://www.delphipraxis.net/60824-wie-erkennen-wann-system-menue-eines-fensters-geoeffnet-wird.html)

mh166 12. Jan 2006 20:01


Wie erkennen, wann System-Menü eines Fensters geöffnet wird?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leute,

und zwar wollte ich ein Programm schreiben, dass in das Systemmenü eines jeden Fensters ein Submenü mit "injiziert", über dass man dann verschiedene Einstellungen zu dem Fenster vornehmen kann (Transparenz, OnTop, ...). Wer nich genau weiß, was ich mein, kann sich mal das Beispiel aus dem Anhang ansehen (is das Systemmenü des Winamp-Fensters).

Nun ist mein Problem aber, wie genau ich das jetzt nun "injizieren" soll: kann man das irgendwie automatisch in alle offenen Fenster reinstecken? Und vor allem: wie bekomm ich dann ne Rückmeldung, von welchem Fenster aus jetzt der Menüpunkt aktiviert wurde? Denn schließlich sollen da ja jeweils für das entsprechende Fenster die Optionen verwaltet werden...

Hoffe ihr könnt mir helfen. :)

mfg, mh166

//Edit: Da hatte wohl jemand nen Anhang vergessen -.-"

mh166 14. Jan 2006 10:52

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
*push to talk* ;)

mfg, mh166

mh166 16. Jan 2006 08:26

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
Manchmal hilft es ja, das Thema am Anfang der Woche wieder ins Gedächtnis zu rufen... Ich hoffe mal, dass mir jemand helfen kann. :?

mfg, mh166

mh166 30. Jan 2006 20:46

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
Delphi-Quellcode:
while not ProblemSolved do
  Push(This.ThreadID);
mfg, mh166

SirThornberry 30. Jan 2006 21:12

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
Ist das Winamp-Menü wirklich im Menü jeder Anwendung oder doch nur in der Anwendung des eigenen Programmes?

mh166 30. Jan 2006 21:38

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
Jaaa! Eine Antwort! :firejump: (Wohl eher eine Frage ;))

Zitat:

Zitat von SirThornberry
Ist das Winamp-Menü wirklich im Menü jeder Anwendung oder doch nur in der Anwendung des eigenen Programmes?

Nein, das WA-Menü is bloß im Menü von Winamp. Aber ich meinte das als Demo, von dem, was ich injizieren will. Sowas, wies halt Winamp beim eigenen Menü macht will ich Systemweit hinbekommen.

mfg, mh166

SirThornberry 30. Jan 2006 21:48

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
naja, das gibt es einen großen Unterschied. Denn winamp kennt sein eigenes Handle, sein eigenes Systemmenü und kann somit auch sein Systemmenü editieren. Eventuell könntest du einen Hook setzen der das erstellen von Fenstern überwacht. Und nach dem ein Fenster erstellt wurde packst du dann noch paar Systemmenüeinträge dazu. Das schwierigste an der ganzen Sache sollte wirklich der Hook sein bzw. das Finden der Systemmenüs.

mh166 31. Jan 2006 11:07

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
Genau das ist ja mein Problem: wie soll ich das lösen. Ich hab halt keine Ahnung, wie man das performant machen könnte. Auf Anhieb sind mir so sachen eingefallen wie "DLL in alle Anwendungen injizieren" und "irgendwelche Messages abfangen". Aber bei beiden habe ich keine Ahnung, wie das zu machen wäre. Es hapert also genau an dem Punkt die Handles zu bekommen.

Wobei danach - je nach Lösung - vllt. auch die Frage aufkommt, wie man die "empfangenen" Menüklicks (also wenn man dann ne Option aus meinem Menü auswählt) dem Ursprungsfenster wieder zuordnen kann... Wenn ich mich recht entsinne hatte hier ja mal einer das Problem, dass er den Sender nicht übermittelt bekam. In welchem Zusammenhang das allerdings war... keine Ahnung. :duck:

Ich hoffe, es gibt jemand, der mir mit Vorschlägen dienen kann, ich komm einfach nicht weiter... :lol:

mfg, mh166

SirThornberry 31. Jan 2006 20:32

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
um in fast alle Prozesse zu kommen brauchst du erstmal einen Hook. Dann könntest du darin dir alle Threads des Prozesses auflisten lassen und von jedem Thread die Fenster. (bzw. gleich alle Fenster auflisten und filtern welche zu diesem Prozess gehören).
Anschließend kannst du mit GetSystemMenu die Systemmenüs der Fenster ermitteln. Dann noch in diesen Systemmenüs einen Eintrag hinzufügen (weiß ich spontan nicht wie) und dann im Click des Menüeintrages mit FindWindow (oder wie auch immer) dein Fenster suchen und diesem eine Message schicken in welchem Fenster geklickt wurde.

Eventuell kannst auch auch mal schreiben was du genau vor hast, vielleicht gibt es ja einen besseren weg als in alle Systemmenüs irgendwas zu injezieren.

[Edit]
Hab mal bischen Hilfe gelesen und dabei ist folgendes raus gekommen. So erstellt man im Systemmenü 2 weitere Einträge (ein Text und 1 Seperator):
Delphi-Quellcode:
var LHandle: Cardinal;
    LInfo: TMenuItemInfo;
    LStr: String;
begin
  LStr := 'Neues Item';

  LHandle := GetSystemMenu(handle, False);
  ZeroMemory(@LInfo, SizeOf(LInfo));
  LInfo.cbSize := SizeOf(LInfo);
  LInfo.fMask := MIIM_TYPE;
  LInfo.fType := MFT_STRING;
  LInfo.fState := MFS_DEFAULT;
  LInfo.wID   := 133;
  LInfo.dwTypeData := PChar(LStr);
  LInfo.cch        := Length(LStr);

  InsertMenuItem(LHandle, 0, True, LInfo);
  LInfo.fType := MFT_SEPARATOR;
  InsertMenuItem(LHandle, 1, True, LInfo);
In diesem zusammenhang dürfte die Message "WM_INITMENU" für dich auch Interessant sein.
Du kannst ja ersmtal versuche ob du das alles hinbekommst solange du deine eigene Anwendung hookst, bzw. diese Message abfängst. Wenn du das geschafft hast dürfte der schritt für die Ausweitung auf andere Programme nicht all zu groß sein.

mh166 4. Feb 2006 13:13

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w
 
Also wie ich ein Item einfüge, dass is kein Problem. Das ganze hatte ich auch vor langer Zeit schon mal für ein Submenu geklärt (siehe hier).

Die Frage ist halt nur, wie ich das mit JEDEM Prozess, statt nur mit meinem eigenen machen kann.

Und zwar will ich einfach - wie bereits gesagt - n bissel an den Fenstereinstellungen des jeweiligen Forms drehen. Unter KDE bspw. gibts ja im Systemmenü jedes Forms noch ein Submenu für die Fenstereinstellungen. Da kann man unteranderem einstellen, obs OnTop sein soll oder nicht und andere dinge...

Nun wollte ich halt die gleiche Funktionalität auch für Windows haben. Also das in jedem Form (nicht nur von meiner Anwendung) ein entsprechendes Submenü drin ist, über welches dann z.B. die Transparenz einstellbar ist oder so.

Das Problem ist aber für mich halt der Fakt: mit welchen Mitteln kann ich ein solches Menü in JEDES Fenster einbauen? Also so, dass auch wenn sich ein neues Fenster öffnet automatisch das Menü mit drin ist. Nun kam ja schon die Sache mit dem Hook: nur wie genau kann ich jetzt ne DLL in wirklich JEDES Fenster hooken lassen um dort meine Menüs zu erzeugen usw.?

mfg, mh166


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz