AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Main Menu Einträge Dritter auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Main Menu Einträge Dritter auslesen

Ein Thema von NeoXan · begonnen am 21. Jan 2006 · letzter Beitrag vom 4. Feb 2006
Antwort Antwort
NeoXan
(Gast)

n/a Beiträge
 
#1

Main Menu Einträge Dritter auslesen

  Alt 21. Jan 2006, 11:52
Hallo,

mein Problem ist eigentlich recht einfach, jedoch mit meinem derzeitigen Wissenstand, nicht ganz so leicht zu lösen.
Ich möchte schlicht weg, z.B. wenn jemand in der Applikation XY das Hauptmenü benutzt (Datei, Bearbeiten etc.) und dann über
die Einträge fährt, dass meine Applikation, welche im Hintergrund läuft, die Caption der einzelnen Items erhält.

Man müsste also doch irgendwie meine Applikation an die andere "anhängen" bzw. irgendwie die Nachrichten abfangen. (Desweiteren sollte es nur bei einer bestimmten Applikation funktionieren, die anderen sollten eigentlich ignoriert werden)

vielen Dank
Florian
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#2

Re: Main Menu Einträge Dritter auslesen

  Alt 31. Jan 2006, 08:33
Ist das Problem jetzt zu schwierig oder zu einfach? Oder ist mein Denkansatz falsch...leider habe ich noch keine Idee, wie genau ich da vorgehen müsste.

vielen Dank
Florian
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Main Menu Einträge Dritter auslesen

  Alt 31. Jan 2006, 09:05
Hallo Florian,

seltsam deine Anforderung. Kannst du erklären warum du so vorgehen willst, anstelle die Einträge im Hauptmenü der anderen Anwendung einfach auszulesen?

Grüße vom marabu
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#4

Re: Main Menu Einträge Dritter auslesen

  Alt 1. Feb 2006, 08:19
Wie auslesen? Das wollte ich doch, wenn meine Applikation läuft und ich z.B. bei dem Internet Explorer auf Datei->Speichern gehe, soll mein Form mir Save anzeigen . Ich wollte also lediglich die Einträge in dem Program übersetzen, d.h. das Program ist in deutsch und wenn ich über einen Menüeintrag fahre, so wird der String eingelesen, verglichen und dementsprechend übersetzt in meinem Form ausgegeben. Ich wollte jetzt nicht die Datei mit einem ResHack/Editor bearbeiten, da ich eine eventuelle Instabilität fürchte, deshalb dieser "umweg" über das Auslesen. Und da dachte ich mir, dass man vielleicht die WM_ abfangen könnte. Wie bereits erwähnt lassen meine Kentnisse in dieser Richtung doch etwas zu wünschen übrig und aufgrund meines Studium ist gerade Zeit nicht so wirklich vorhanden und mich da richtig reinzuarbeiten, bis ich dann die Lösung finde, deshalb bitte ich, ob mich jemand vielleicht schonmal in die richtige Richtung drehen könnte.

vielen Dank
Florian
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Main Menu Einträge Dritter auslesen

  Alt 1. Feb 2006, 08:55
Wenn im Programm XY das Hauptmenü geöffnet wird, dann werden bestimmte Nachrichten an das Fenster geschickt, dem der Menubar zugeordnet ist. Die WindowProc dieses Fensters verarbeitet dann diese Nachrichten und erzeugt dann beispielsweise die Hints für die einzelnen Menüeinträge. Wenn du die dich mit einem eigenen message handler in die WindowProc des Hauptfensters von XY einklinkst, dann könntest du diese Nachrichten auswerten, bevor du sie an den original message handler weiterreichst.

Mit FindWindow() kannst du dir das Handle h auf das Hauptfenster von XY besorgen. Mit GetWindowLong(h, GWL_WNDPROC) kannst du dir die Einsprungadresse des fremden message handlers holen und zwischenspeichern. Mit SetWindowLong() kannst du einen eigenen handler dazwischen schieben, aus dem du dann die Nachrichten an den zwischengespeicherten handler weiter reichst. Wenn du dein Programm zuerst beendest und das fremde handle noch existiert - was du mit IsWindow() prüfen kannst - dann musst du natürlich den original handler wieder einsetzen, damit das fremde Programm weiter funktioniert.

Soweit die Theorie. Ich hoffe es hilft dir. Viel Spaß beim Umsetzen.

marabu
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#6

Re: Main Menu Einträge Dritter auslesen

  Alt 1. Feb 2006, 20:52
Alles klappt soweit perfekt, danke erstmal. Nur meinen eigenen Handle "zwischenschieben" will nicht so ganz, also ich habe z.B. jetzt

Delphi-Quellcode:
    WindowHandle : HWND;
MessageHandle : LongInt;
WindowHandle ist der Handle von der Applikation XY und Message Handle ist GetWindowLong(WindowHandle, GWL_WNDPROC);

Jetzt hänge ich bei:
SetWindowLong( MessageHandle, bzw. ich habe ja noch nicht einmal eine Prozedur um die MESSAGE abzufangen. Wie gesagt, ist das erstemal, dass ich mich damit befasse. :/

Ich dachte da in Richtung
Delphi-Quellcode:
procedure MessageHandler(var Message: TMessage);
begin
  case Message.Msg of

    WM_IRGENDWAS:
      begin
       {irgendwas}
      end;

end;
vielen Dank bis jetzt
Florian


EDIT
================

Okay, bin jetzt ein wenig weiter
Delphi-Quellcode:
function InjectOwnHandle(): boolean;
begin
  LastProc := Pointer(GetWindowLong(WindowHandle, GWL_WNDPROC));
  SetWindowLong(WindowHandle, GWL_WNDPROC, Integer(@WindowProc));
end;

function WindowProc(H : HWND; Msg : Cardinal; wParam, LParam : Cardinal) : Integer; stdcall;
Begin
  If Msg = XXX Then begin

  end;

  Result := CallWindowProc(LastProc, H, Msg, wParam, LParam);
End;
und bei Destroy habe ich
  SetWindowLong(WindowHandle, GWL_WNDPROC, Integer(LastProc)); drinn.

Nur es kommt ein Fehler bei der InjectOwnHandle Funktion...mein Compiler sagt, er erwartet eine Variable???
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#7

Re: Main Menu Einträge Dritter auslesen

  Alt 2. Feb 2006, 17:07
Okay, also es klappt jetzt so mehr oder weniger das mit den Handlen,

In meiner neuen Funktion NewWndProc, welche ich über SetWindowLong(WindowHandle, GWL_WNDPROC,LongInt(@NewWndProc)); anhänge habe ich z.B. folgendes stehen, jedoch erscheint egal was ich tuhe, niemals eine ShowMessage mit dem String Message, oder bye...
Delphi-Quellcode:
...
  ShowMessage('Message');
  case Msg of
    WM_DESTROY : begin
                      ShowMessage('bye');
...
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#8

Re: Main Menu Einträge Dritter auslesen

  Alt 4. Feb 2006, 16:08
hmm, also neuer Ansatz:

Ich habe mir Madshi's madCollection geholt und eine weile 'rumprobiert jedoch auch nicht wirklich weiter gekommen.

Aufgabe für mich ist:
1. Das notepad starten
1a. oder meine Applikation starten, welche dann das Notepad startet und gleich die DLL injected
2. wenn ich im Notepad über das MenuItem Datei mit der Maus fahre, soll in meiner Applikation als String Datei stehen


Meine Theorie ist folgende...
Ich habe meine DLL, wo die Funktion drinn' steht welche Nachrichten abfängt und verarbeitet. Handelt es sich um die Nachricht, dass ein Menüeintrag ausgewählt worden ist, so wird der String verarbeitet JEDOCH der eigentlich Programmablauf des Notepads nicht unterbrochen. Nach längerem Foren durchforsten bin ich nun zu folgender Erkenntnis gekommen, dass ich also nun 3 Dinge habe:

1. Das Notepad
2. meine Applikation welche die DLL injected
3. meine DLL

Sollte es doch wieder irgendwie anders gehen, also ohne DLL, dann bitte auch bescheid sagen. Nicht, dass ich hier wieder in eine völlig falsche Richtung renne.

Folgende Problem tuhen sich mir nun auf:
1. Was genau muss in der DLL stehen?!?!
bis jetzt schaut sie nur so aus...und das macht eigentlich auch nichts
Delphi-Quellcode:
var
  OldWndProc : Pointer = nil;

////////////////////////////////////////////////////////////////////////////////
// OWN HANDLE //////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
function NewWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
////////////////////////////////////////////////////////////////////////////////
  function CallOld: LRESULT;
  begin
    Result := CallWindowProc(@OldWndProc, hWnd, Msg, wParam, lParam);
  end;
////////////////////////////////////////////////////////////////////////////////
begin
  // Result := DefWindowProc(hWnd, Msg, wParam, lParam); // standardWndProc aufrufen
  case Msg of
    WM_QUIT : begin
                      ShowMessage('bye');
                    end;
  end;
  Result := CallOld;
end;

begin


end.
2. Wie schaffe ich das denn, dass die Funktion in der DLL wiederum auf mein Programm zugreifen kann, sprich auf mein Form, wo dann der String 'reingeschrieben werden soll. Oder geht das, wenn man eine DLL benutzt ganz anders.

Ich hoffe jetzt bin ich schon ein Stückchen weiter...wäre schön wenn mir da jemand weiterhelfen könnte...
also sprich
"wenn ich im Notepad über das MenuItem Datei mit der Maus fahre, soll in meiner Applikation als String Datei stehen".
Bzw. sollte das denn nicht nur ausschließlich auf's Notepad beschränkt sein.

vielen vielen Dank
Florian
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:10 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