Entwickler-Ecke

Windows API - Editfelder einer fremden Anwendung füllen und Button drücken


MadMaiden - Di 15.07.03 10:02
Titel: Editfelder einer fremden Anwendung füllen und Button drücken
Hallo Leute...

ich habe ein Kleines Problem.... Ich habe ein Programm dass nicht in Delphi geschrieben wurde, genauer in vc++. Ich ein Programm erstellen dass dieses Programm offnet und danach ihm strigns in jedes seiner Felder zuschickt.
Dass Programm(VC++) siht ziemlich einfach aus, 4 edit felder, und ein Knopf. Nachdem die Strings zugeschickt worden sind, soll mein Programm auch auf dem Knopf des anderen Drucken.

Wie kann man dass realisien???... ich habe schon nach mehren tutorials gesucht, aber nichts der gleichen gefunden.

Moderiert von user profile iconTino: Titel geändert.


Motzi - Di 15.07.03 10:32

Was genau brauchst du? Wie man etwas in die Edits einträgt oder wie man den Knopf drückt? Was die Edits betrifft such mal nach Suche in: Delphi-Forum, Delphi-Library WM_SETTEXT und falls es ein "normaler" Button ist sollte Suche in: Delphi-Forum, Delphi-Library BM_CLICK das sein was du suchst...


MadMaiden - Di 15.07.03 10:58

danke fur den Hinweis...

Ich habe dass geschrieben, aber es funk nich... wieso:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
shellexecute(handle,'open',PChar('E:\dts\Release\dts.exe'),nil,nil,SW_SHOW);
s:='test';
x:=FINDWINDOW(PChar('DTS'),nil);
if x>0 then
     begin
         y:=FindWindowEx(x,0,'TEdit',nil);
         SendMessage(y, WM_SETTEXT, 0, Integer(@s[1]));
     end;
end;


Bitte verbesset mich ob ich fehle.... FINDWINDOW sucht ein offenes fenster, un falls es gefunden hat, gib es den handle zuruck als hwnd
FINDWINDOWEX sucht eine "Komponente" in ein handle, und falls es dieses gefunden hat, gibt es das handle der Komponenten zuruck... Sendmessage, sendet ein Test in ein bestimmtes handle.../

Weil ja FINDWINDOWEX eine "Komponente" sucht, und ich mehrere dieser in mein VC++ programm habe, wie kann ich zBsp nur einem beschtimmten TEdit ein Text zuschicken...?


Motzi - Di 15.07.03 11:11

Also wenn das Prog in VC++ geschrieben wurde, dann ist der Klassenname der Edits ganz sicher nicht TEdit..!! Schau dir am besten mal das Prog mit einem Prog wie WinSight, Spy++ oder meinem X-Spy an und schau mal welche Klassennamen die Felder haben...


MadMaiden - Di 15.07.03 11:40

Ich habe dein Programm runtergeladen, und bin auf Windows geganden, und dort das "DTS" programm gesehen. Ich habe bei FINDWINDOW als zweites Parameter "DTS" geschrieben....aber geht nicht...wieso..?

Quelltext
1:
2:
3:
4:
5:
HWND FindWindow(      

    LPCTSTR lpClassName,
    LPCTSTR lpWindowName
);



Delphi-Quelltext
1:
2:
3:
4:
shellexecute(handle,'open',PChar('E:\dts\Release\dts.exe'),nil,nil,SW_SHOW);  
x:=FINDWINDOW(nil,'DTS'); 
if x>0 then
      showmessage('something')

x bleibt auch in diesem Fall 0....


MadMaiden - Di 15.07.03 12:03

ich glaube ich habe gefunden wo der Feher war.... Das programm offnet sich zu langsam, und so, sucht mein programm nach einem namen, dass noch nicht existiert...
wie kann man dass verzogern...?


Motzi - Di 15.07.03 13:03

Das Prog mit Suche in: Delphi-Forum, Delphi-Library CREATEPROCESS starten und mit WaitForInputIdle auf den Prozess warten...


MadMaiden - Di 15.07.03 14:49

und woher krieg ich den hwnd parameter fur waitforinputidle


Motzi - Di 15.07.03 15:03

WaitForInputIdle ertwartet kein Window-Handle (HWND) sondern ein Process-Handle! Deswegen hab ich auch geschrieben, dass du den Prozess mit CreateProcess erzeugen sollst...
WaitForInputIdle: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforinputidle.asp


MadMaiden - Di 15.07.03 15:33

danke sehr.....
geht schon...


ps... X-SPY ist wirklich Klasse.... :wink:


MadMaiden - Di 15.07.03 17:09

jetzt bin ich leider wider an einem pkt angekommen wo ich nachfragen muss.... :oops: ich habe, das Programm(VC++) geschtartet, hab die felder gefullt, habe den Knopf gedruckt.... Jedoch wenn ich den knopf drucke, erscheint mir ein Infofenster, dass den selben namen hat... Dieses Info hat auch ein Button... wie kann ich dieses drucken....???

ich habe es versucht.... genauso wie dass andere zu drucken, aber, geht nicht. und wenn ich mit der Maus den Knopf aus dem Infofenster drucke, dann druckt sich automatisch noch einmal der Knopf das als erstes gedruckt wurde, und dass Infofenster kommt wieder zum vorschein....

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
var dts,serv,user,pass,pack,but,dts2,but2:hwnd;
    s,u,p,pk:string;

function Starte(appname: string): boolean;
var StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(TStartupInfo),0);
  StartupInfo.cb:=SizeOf(TStartupInfo);
  if CreateProcess(nil, PChar(appname), nilnil, false,
  NORMAL_PRIORITY_CLASS, nilnil, startupinfo, ProcessInfo) then
  begin
    try
      waitforinputidle(processinfo.hProcess, INFINITE);
    finally
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
    result:=true;
  end
  else
    result:=false;
end;


begin
if Starte('E:\dts\Release\dts.exe'then
   begin
sleep(10);
label1.caption:='';
s:='HAL42';u:='sa';p:='just4fun';pk:='NDS';
dts:=FindWindow(nil,'DTS');

if dts=0 then showmessage('0');

serv:=FindWindowEx(dts,0,'Edit',nil);
Sendmessage(serv,WM_SETTEXT,0,Integer(@s[1]));

user:=FindWindowEx(dts,serv,'Edit',nil);
Sendmessage(user,WM_SETTEXT,0,Integer(@u[1]));

pass:=FindWindowEx(dts,user,'Edit',nil);
Sendmessage(pass,WM_SETTEXT,0,Integer(@p[1]));

pack:=FindWindowEX(dts,pass,'Edit',nil);
SendMessage(pack,WM_SETTEXT,0,Integer(@pk[1]));

SetActiveWindow(dts);

but:=FindWindowEx(dts,0,'Button',nil);
SendMessage(but,BM_CLICK,0,0);

dts2:=FindWindow(nil,'dts');//hier will ich den Knopf aus dem Infofenster drucken.....
but2:=FindWindowEx(dts2,0,'Button',nil);
SendMessage(but2,BM_CLICK,0,0);
end;
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.