Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_COPYDATA msg senden und gleichzeitig antwort erhalten? (https://www.delphipraxis.net/87084-wm_copydata-msg-senden-und-gleichzeitig-antwort-erhalten.html)

1234588 23. Feb 2007 02:59


WM_COPYDATA msg senden und gleichzeitig antwort erhalten?
 
hallo community

http://www.delphipraxis.net/internal...ight=tformrecv

dieses snippet hab ich in mein programm eingebaut und hab ein kleineres anliegen.
nehmen wir an ich möchte die caption meiner anwendung auslesen, natürlich könnte man das mit WM_GETTEXT machen aber das soll ja nur ein bsp. sein.
als erstes erhalte das handle meiner anwendung mittels FindWindow und sende meine nachricht an das programm, dieses wertet die nachricht aus und sendet an Msg.From meine caption die ich erhalten möchte, mein problem ist eben nun das ich in beiden anwendungen die "WMCopyData" procedure habe, das ich in beiden anwendungen die nachrichten mühsam auswerten muss.
ich hab eigentlich relativ wenig lust auf so ein hin und her.
ich bins von winamp gewohnt das man das z.b. so machen kann:
Delphi-Quellcode:
var
  i: Integer;
begin
  i := SendMessage(FindWindow('Winamp v1.x', nil), WM_USER, 0, 104);
das gibt mir den aktuellen status von winamp zurück, 1 für play, 3 für pause und alles andere für stop. hier wirkt sendmessage wie eine function die mir einen wert zurück gibt und das hätte ich auch gerne, nur hab ich keine idee wie ich das realisieren könnte und würde mich sehr über ein kleines beispiel freuen

SirThornberry 23. Feb 2007 05:57

Re: WM_COPYDATA msg senden und gleichzeitig antwort erhalten
 
Der unterschied ist das bei dem einen der Rückgabetyp eine Zahl ist bei dem anderen eine Zeischenkette.
Eine Zahl kann einfach über das Messageresult zurück gegeben werden, bei Zeischen geht das nicht weil das Messageresult eben nur ein 4 Byte großer Integer ist.

sirius 23. Feb 2007 06:50

Re: WM_COPYDATA msg senden und gleichzeitig antwort erhalten
 
Du könntest einen Pointer auf deine Zeichenkette zurückgeben und dann mit readprocessmemory den string auslesen. Da musst du allerdings absichern, dass der String in dem einen Process solange existiert, bis der andere ihn ausgelesen hat.

die zweite Möglichkeit ist du reservierst in dem (sendmessage) aufrufenden Process Speicher für die Zeichenkette und der verarbeitende Process schreibt mit writeprocessmemory sein Ergebniss dort rein. Damit umgehst du die Laufzeitprobleme aus der ersten Methode.

Die dritte Methode geht über globalAtoms. Ein Atom ist nix weiter als eine String mit Referenznummer. Mit dieser Nummer kannst du recht einfach in einem anderen Process den String lesen. Und mit Sendmessage überlieferst du nur die Nummer


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 Uhr.

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