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 Programm über SendMessage kontrollieren (https://www.delphipraxis.net/85753-programm-ueber-sendmessage-kontrollieren.html)

Hybrid666 4. Feb 2007 12:43


Programm über SendMessage kontrollieren
 
Hi,

winamp hat eine funktion, das ich es mit jedem programm per command
Delphi-Quellcode:
SendMessage(getwinamphwnd,WM_COMMAND,40048,0);
steuern kann. ich wollte mal wissen wie ich so etwas in mein project einbauen kann, da ich es gerne auf gleiche weiße steuern können möchte...

MfG Hybrid666

dominikkv 4. Feb 2007 12:49

Re: Programm über SendMessage kontrollieren
 
hi
du hast doch den eigendlichen befehl schon geschrieben...
was du brauchst ist einfach nur die HWND von winamp... schau mal nach FindWindow
SpyEx und WinSpy können dir auch helfen

Hybrid666 4. Feb 2007 12:59

Re: Programm über SendMessage kontrollieren
 
nein nein, war scheiße erklär von mir...ich will ein project schreiben, das auf sendmessage reagiert, wie winamp, z.B. wenn ich was mit sendmessage an mein programm sende, so soll dies einach timer1 aktivieren, so war das gemeint...also das eine prozedur aus meinem programm gestartet wird wenn ein anderes programm eine sendmessage dahin schickt....

sirius 4. Feb 2007 13:09

Re: Programm über SendMessage kontrollieren
 
Na dann erzähl mal genauer was du willst. du hast im Prinzip zwei Möglichkeiten (wenn du VCL benutzt)

1. vorhadene Messages deiner Fenster/formulare nutzen
2. eigene Messages "definieren" und im Programm asuwerten

Hybrid666 5. Feb 2007 17:25

Re: Programm über SendMessage kontrollieren
 
also:

ich habe programm A und Programm B.

Programm A Sendet nun an Programm B

Delphi-Quellcode:
SendMessage(PROGRAMMBHWND,WM_COMMAND,1000,0);
und Programm B führt daraufhin die prozedure react_1000 aus...

wie realisiere ich das?

sirius 5. Feb 2007 17:38

Re: Programm über SendMessage kontrollieren
 
Da definierst du dir einfach erstmal eine eigene Message
Delphi-Quellcode:
const WM_myMSG=WM_USER+1
Ab WM_USER ist dein Bereich, da kannst du dich austoben und eigene Messages definieren, da reagiert dann auch kein anderes Control drauf.

Bekommen und auswerten tust du diese Message so:
Delphi-Quellcode:
//Programm A

type TForm1=class(TForm)
       //...
       private
         procedure irgendetwas(var Msg:TMessage);message WM_myMSG;
end;

//...

procedure TForm1.irgendetwas(var Msg:TMessage);
begin
  //hier hast du jetzt lparam und wparam
  if msg.LParam= //...
  if msg.Wparam

  msg.result:=712; //hier kannst du irgendetwas zurückgeben
end;
Eine Message an TForm1 verschicken geht mit:
Delphi-Quellcode:
  //Programm B (hier muss das Handle von Tform1 aus Programm A bekannt sein)

  r:=sendmessage(Handle,WM_user+1,0,0); //kannst natürlich hier auch für wm_user+1 eine Konstante festlegen
  //in r steht jetzt das msg.result
Achtung: Bei sendmessage wartet Programm B bis A fertig ist mit dem abarbeiten der Funktion. Wenn das nicht gewünscht ist nimm Postmessage (dann kriegst du aber kein result)

shmia 5. Feb 2007 18:42

Re: Programm über SendMessage kontrollieren
 
Zitat:

Zitat von Hybrid666
...ich will ein project schreiben, das auf sendmessage reagiert

Microsoft vor vielen Jahren DDE (Dynamik Data Exchange) erfunden um die Fernsteuerung von Programmen in stabile Bahnen zu führen.
DDE ist inzwischen veraltet und durch Active-X / Automatisierung abgelöst.
Also stehen nun 3 Techniken für die Fernsteuerung zur Verfügung:
1.) über userdefinierte Windows Messages
2.) DDE
3.) ActiveX
Willst du wirklich die schlechteste Technik benützen?

Hybrid666 9. Feb 2007 15:21

Re: Programm über SendMessage kontrollieren
 
wenn du mir die ActiveX variante erklären könntest dann würde ich auch eine andere nehmen ;)

MfG

P.S.: Ein tut tuts auch :P

shmia 9. Feb 2007 18:37

Re: Programm über SendMessage kontrollieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Hybrid666
wenn du mir die ActiveX variante erklären könntest...

ActiveX ist nicht ganz einfach; am Besten ein Buch kaufen.
Aber ich hab dir mal eine ganz einfache Anwendung in den Anhang gepackt.
Kurz-Anleitung
Projekt kompilieren und starten.
Dann die Scriptdatei testscript.vbs doppelklicken.

Scorpion 11. Mär 2007 19:35

Re: Programm über SendMessage kontrollieren
 
Hi...

@sirius:

Wie kann ich denn Text senden, also nen String z.B. ?

Vielen Dank

sirius 11. Mär 2007 20:56

Re: Programm über SendMessage kontrollieren
 
Über Messages geht es so einfach nicht.
Vielleicht ist ein anderes Konzept für dich günstiger. Ich kenn aber dein Programm nicht.

Hier erstmal die Lösung für Messages:
Du kannts immer nur 32bit-Werte senden. Da passt selten ein ganzer Text rein. Allerdings passt da ein Pointer rein. Das ist dann Variante 1. Du schickst von Programm A einen Pointer an Programm B rüber, der sagt wo der String liegt und in Programm B kannst du dann die Zeichenkette über "readprocessmemory aus Programm A" auslesen. Da musst au Allerdings sicher stellen, dass Programm A den String solange bereit hält, bis B ihn ausgelesen hat.
Variante 2 ist über ein globales Atom. Da kannst du global einen string hinterlegen und der ist mit seiner Nummer von jedem Programm aus lesbar und die Nummer schickst du über Messages.

Das erstmal kurz dazu.

Wenn du viel Text (also immer wieder Text) schicken willst, solltest du vielleicht mal über andere Möglichekiten (Pipes z.B.) nachdenken.

SirThornberry 11. Mär 2007 21:01

Re: Programm über SendMessage kontrollieren
 
oder einfach ein wm_copydata

sirius 12. Mär 2007 07:22

Re: Programm über SendMessage kontrollieren
 
Zitat:

Zitat von SirThornberry
oder einfach ein wm_copydata

Das ist ja vielleicht ein billige Variante :mrgreen: . Je nach "ZielControl" kann man da bestimmt auch WM_SetText/WM_GetText einsetzen :gruebel: .

Scorpion 12. Mär 2007 11:51

Re: Programm über SendMessage kontrollieren
 
Hi,

vielen dank für eure beiträge. die wm_copydata variante gefällt mir sehr gut. hab mich auch schon auf der ms seite informiert, jedoch werde ich daraus nicht so schlau.

wie könnte das denn in delphi aussehen ?

vielen dank

sirius 12. Mär 2007 12:32

Re: Programm über SendMessage kontrollieren
 
Ich würde es spontan so sagen (ungetestet):
Delphi-Quellcode:
procedure sending(text:string);
var data:TCopyDataStruct;
begin
  data.dwdata:=0;
  data.cbdata:=length(text);
  data.lpdata:=@text[1]
  sendmessage(zielhandle,wm_copydata,selfhandle,integer(@data));
end;
Delphi-Quellcode:
type xxx=class(TForm)
     ...
     procedure receiving(var msg:TWMCopydata):message wm_copydata;
     ...
end;

...

procedure receiving(var msg:TWmcopydata);
begin
  //Message in msg.copydatastruct
end;
Edit: Wenn ich mir das so ansehe, finde ich es nicht einfacher als Atoms :gruebel:
Edit2: 1 Fehler behoben

Scorpion 12. Mär 2007 14:04

Re: Programm über SendMessage kontrollieren
 
@sirius:

wie würde denn die Atoms Variante aussehen, noch nie gehört *g* ?

sirius 12. Mär 2007 14:14

Re: Programm über SendMessage kontrollieren
 
Delphi-Quellcode:
procedure send(s:string);
var wparam,lparam:integer;
begin
  wparam:=globaladdAtom(pchar(s));
  lparam:=length(s);
  sendmessage(zielhandle,WM_User+10,wparam,lparam);
  globaldeleteatom(wparam);
end;
Das "+10" kann auch anders sein, Hauptsache ist, du hast in beiden Programmen dieselbe Nummer und sie ist nicht kleiner als WM_User
Delphi-Quellcode:
type xxx=class(Tform)
     ...
     procedure receive(var msg:TMessage);message wm_user+10;
end;


procedure xxx.receive(var msg:TMessage);
var s:string;
begin
  setlength(s,msg.lparam);
  globalgetatomname(msg.wparam,@s,msg.lparam); //könnte auch @s[1] sein oder so...
  //s im Prog weiterleiten
end;

Scorpion 12. Mär 2007 14:24

Re: Programm über SendMessage kontrollieren
 
Hi,

klappt soweit schon fast wunderbar... mein Programm empfängt die Nachricht, aber hier

Delphi-Quellcode:
setlength(s,msg.lparam);
globalgetatomname(msg.wparam,@s,msg.lparam); //könnte auch @s[1] sein oder so...
scheint noch ein fehler zu sein, es gibt immer ne fehlermeldung ??

sirius 12. Mär 2007 14:25

Re: Programm über SendMessage kontrollieren
 
Dann nimm mal statt @s, @s[1]

Scorpion 12. Mär 2007 14:31

Re: Programm über SendMessage kontrollieren
 
Ok klappt wunderbar! Danke

aber sehe ich das richtig, dass ich jetzt jedes empfangene Zeichen in s[i] wieder zusammensetzen muss ?

sirius 12. Mär 2007 14:37

Re: Programm über SendMessage kontrollieren
 
Nö siehst du falsch.
Sollte alles in s vorliegen. Überprüfe es doch einfach mal.

Ich übergebe ja nur den pointer auf das erste Zeichen und er kopiert dann msg.lparam zeichen an diese Adresse. Aber hintereinander. Und mit setlength(s,..) hab ich genügend speicherplatz reserviert.

Scorpion 12. Mär 2007 16:11

Re: Programm über SendMessage kontrollieren
 
Hi, ok, jetzt hab ichs auch... ich hab nur noch ein riesen problem, das habe ich jetzt erst bemerkt

in der funktion, wo ich die daten empfange...

angenommen, ich habe die daten die ich empfangen habe in einen string kopiert, z.b. data : String;

wenn ich jetzt versuche mit diesem string weiterzuarbeiten geht garnichts mehr.

ich versuche lediglich folgenden code anzuwenden:

Delphi-Quellcode:
showmessage(Data + '...');
doch anstatt den ... sehe ich nur leerzeichen, ich hab keine peilung warum ???

sirius 12. Mär 2007 16:28

Re: Programm über SendMessage kontrollieren
 
Entschuldige PChar und String auf die harte Tour zu verainbaren ist nicht so einfach:
Delphi-Quellcode:
procedure xxx.receive(var msg:TMessage);
var s:string;
begin
  setlength(s,msg.lparam+1);
  l:=globalgetatomname(msg.wparam,@s[1],msg.lparam+1);
  setlength(s,msg.lparam);

end;

torud 5. Sep 2007 11:19

Re: Programm über SendMessage kontrollieren
 
Da ich gerade dabei bin das ganze hier nachzuvollziehen aber immer wieder scheitere, weil im empfangenden Programm nichts ankommt, frage ich mich nun ernsthaft wodurch denn die Recieve-procedure aufgerufen oder ausgelöst werden soll.

Ich habe mal die durch xxx angegebenen namen durch meine ersetzt. ich hoffe es liegt nicht daran...:-)

Delphi-Quellcode:
  public
    { Public-Deklarationen }
    procedure Receive(var msg:TMessage);message wm_user+10;
  end;

procedure TForm1.Receive(var msg:TMessage);
var s:string;
    l:cardinal;
begin
  ShowMessage('kommt was!'); // wird nicht aufgerufen, daher die vermutung, dass die procedure nicht aufgerufen wird...
  SetLength(s,msg.lparam);
  l:=GlobalGetAtomName(msg.wparam,@s[1],msg.lparam+1);
  setlength(s,msg.lparam);
  ShowMessage(s); //wird nicht angezeigt
end;
Habe ich etwas wichtiges vergessen???


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 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