AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie erkennen, wann System-Menü eines Fensters geöffnet wird?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie erkennen, wann System-Menü eines Fensters geöffnet wird?

Ein Thema von mh166 · begonnen am 12. Jan 2006 · letzter Beitrag vom 6. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Wie erkennen, wann System-Menü eines Fensters geöffnet wird?

  Alt 12. Jan 2006, 21:01
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 -.-"
Miniaturansicht angehängter Grafiken
systemmen__133.jpg  
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 14. Jan 2006, 11:52
*push to talk*

mfg, mh166
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 16. Jan 2006, 09:26
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
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 30. Jan 2006, 21:46
Delphi-Quellcode:
while not ProblemSolved do
  Push(This.ThreadID);
mfg, mh166
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 30. Jan 2006, 22:12
Ist das Winamp-Menü wirklich im Menü jeder Anwendung oder doch nur in der Anwendung des eigenen Programmes?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 30. Jan 2006, 22:38
Jaaa! Eine Antwort! (Wohl eher eine Frage )

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
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 30. Jan 2006, 22:48
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 31. Jan 2006, 12:07
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.

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

mfg, mh166
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 31. Jan 2006, 21:32
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: Wie erkennen, wann System-Menü eines Fensters geöffnet w

  Alt 4. Feb 2006, 14:13
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
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz