![]() |
Programm über SendMessage kontrollieren
Hi,
winamp hat eine funktion, das ich es mit jedem programm per command
Delphi-Quellcode:
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...
SendMessage(getwinamphwnd,WM_COMMAND,40048,0);
MfG Hybrid666 |
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 |
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....
|
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 |
Re: Programm über SendMessage kontrollieren
also:
ich habe programm A und Programm B. Programm A Sendet nun an Programm B
Delphi-Quellcode:
und Programm B führt daraufhin die prozedure react_1000 aus...
SendMessage(PROGRAMMBHWND,WM_COMMAND,1000,0);
wie realisiere ich das? |
Re: Programm über SendMessage kontrollieren
Da definierst du dir einfach erstmal eine eigene Message
Delphi-Quellcode:
Ab WM_USER ist dein Bereich, da kannst du dich austoben und eigene Messages definieren, da reagiert dann auch kein anderes Control drauf.
const WM_myMSG=WM_USER+1
Bekommen und auswerten tust du diese Message so:
Delphi-Quellcode:
Eine Message an TForm1 verschicken geht mit:
//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;
Delphi-Quellcode:
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)
//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 |
Re: Programm über SendMessage kontrollieren
Zitat:
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? |
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 |
Re: Programm über SendMessage kontrollieren
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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. |
Re: Programm über SendMessage kontrollieren
Hi...
@sirius: Wie kann ich denn Text senden, also nen String z.B. ? Vielen Dank |
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. |
Re: Programm über SendMessage kontrollieren
oder einfach ein wm_copydata
|
Re: Programm über SendMessage kontrollieren
Zitat:
|
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 |
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:
Edit: Wenn ich mir das so ansehe, finde ich es nicht einfacher als Atoms :gruebel:
type xxx=class(TForm)
... procedure receiving(var msg:TWMCopydata):message wm_copydata; ... end; ... procedure receiving(var msg:TWmcopydata); begin //Message in msg.copydatastruct end; Edit2: 1 Fehler behoben |
Re: Programm über SendMessage kontrollieren
@sirius:
wie würde denn die Atoms Variante aussehen, noch nie gehört *g* ? |
Re: Programm über SendMessage kontrollieren
Delphi-Quellcode:
Das "+10" kann auch anders sein, Hauptsache ist, du hast in beiden Programmen dieselbe Nummer und sie ist nicht kleiner als WM_User
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;
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; |
Re: Programm über SendMessage kontrollieren
Hi,
klappt soweit schon fast wunderbar... mein Programm empfängt die Nachricht, aber hier
Delphi-Quellcode:
scheint noch ein fehler zu sein, es gibt immer ne fehlermeldung ??
setlength(s,msg.lparam);
globalgetatomname(msg.wparam,@s,msg.lparam); //könnte auch @s[1] sein oder so... |
Re: Programm über SendMessage kontrollieren
Dann nimm mal statt @s, @s[1]
|
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 ? |
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. |
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:
doch anstatt den ... sehe ich nur leerzeichen, ich hab keine peilung warum ???
showmessage(Data + '...');
|
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; |
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:
Habe ich etwas wichtiges vergessen???
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; |
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