Entwickler-Ecke

Sonstiges (Delphi) - Programm-Handling


error - Do 31.10.02 22:19
Titel: Programm-Handling
Hi,
wie mache ich folgende Sachen:
a) Ein Programm ausführen
b) ein Programm aktivieren
c) einem Programm Tastendrücke simulieren

und was muss ich beachten?

thxia error


CenBells - Fr 01.11.02 01:00

ein programm ausführen machst du per

shellexecute in der unit shellApi

gruß
Ken


Delete - Fr 01.11.02 01:18

a) Shellexecute oder CreateProcess
b) SetForeWindow, SetFocus oder ein WM_ACTIVATE an das Fenster schicken
c) Koimmt darauf an, werd mal etwas genauer.


error - Fr 01.11.02 12:43

*genauerwerd*
Also... ich möchte ein Programm mit Parametern starten ("C:\Programm.exe -parameter1"). Wenn das Programm fertig geladen hat möchte ich ihm bestimmte Tasteneingabe simulieren (wie z.B. Alt+D um das D&atei-Menü zu öffnen). Dann möchte ich noch ein anderes Programm starten und diesem Programm auch Tastendrücke senden. Danach soll alles wieder beendet werden.


Tino - Fr 01.11.02 20:30
Titel: Re: Programm-Handling
error hat folgendes geschrieben:
wie mache ich folgende Sachen:
a) Ein Programm ausführen
b) ein Programm aktivieren
c) einem Programm Tastendrücke simulieren

Bitte in Zukunft für jede Frage ein Topic erstellen!

Gruß
TINO


Delete - Sa 02.11.02 05:02

Sorry bei b) muß es natürlich SetForegroundWindow heißen.

So das mit den Tastendrücken. Man muß sich erstmal davon lösen andere Programme per Code so steuern zu wollen, wie als wenn man es tut, wen man vor dem Bildschirm sitzt.
Beispiel: Button-Klicken
Man könnte natürlich per Programmcode die Maus über den Button bewegen und dann an dieser Stelle einen Klick mit der Maus simulieren. Einfacher ist es allerdings, wenn man sich das Handle (die Kennziffer des Buttons - wird von Windows vergeben) besorgt und dann an diesen Button ein BM_CLICK schickt. Also genau die Nachricht auslöst, die auch ausgelöst wird, wenn man per Maus auf den Button klickt.

So folgender Code startet Notepad, "aktiviert" es (wie du dich ausdrückst) und öffnet den Dateiöffnen-Dialog vom Editor:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd, hMenu, hSubmenu, MenuItemID: Cardinal;
begin
  Shellexecute(Handle, 'open', PChar('notepad.exe'), nil, nil, SW_SHOW);
  Sleep(500);
  hWnd := FindWindow('Notepad', 'Unbenannt - Editor');
  SetForeGroundWindow(hWnd);
  hMenu := GetMenu(hWnd);
  hSubmenu := GetSubmenu(hMenu, 0);
  MenuItemID := GetMenuItemID(hSubMenu, 1);
  SendMessage(hWnd, WM_COMMAND, MenuItemID, 0);
end;


Sonst noch irgendwelche Wünsche? :wink:


error - Sa 02.11.02 11:36

Danke Luckie... das war genau das was ich wollte...

Du bist (m)ein Gott :D


error - Mo 04.11.02 21:01

Ok..Luckie hat ja gesagt ich kann dem Programm Events per "SendMessage(hWnd, WM_COMMAND, MenuItemID, 0);" senden. Meine Frage dazu: Wie kann ich etwas klickbares "klicken" und wie finde ich den Namen raus? Wo bekomm ich zum 'rausfinden Programme?


Delete - Mo 04.11.02 21:09

Wie, "was anklickbares" ???

Bei Windows ist alles anklickbar: Checkboxen, Radion-Buttons, Listboxen, Comboboxen, Edits, Buttons, ...

Aber wie man auf einen Button klickt habe ich dir schon gesagt.


error - Mo 04.11.02 21:25

Luckie hat folgendes geschrieben:
Wie, "was anklickbares" ???

Bei Windows ist alles anklickbar: Checkboxen, Radion-Buttons, Listboxen, Comboboxen, Edits, Buttons, ...

Aber wie man auf einen Button klickt habe ich dir schon gesagt.


Also... es ist ein Button.
Wie man Buttons an sich klickt hast du mir ja gesagt, klar. Aber mein Problem als etwas vertrottelter Delphi-Anfänger ist dieses:
a) Wo bekomm ich ein Beispiel her?
b) Wie finde ich raus welche Bezeichnung ein Button hat (welche ID ode r so) und bleibt diese bei jedem Programmstart gleich?

Anders gesagt:
Ich will einen Button in einem fremden Programm klicken. (kann auch ein klickbares Label oder so sein. Es bewirkt bloss bei einem Klick was...)

Tut mir leid wenn ich zu ungenau bin...
mfg error


Delete - Mo 04.11.02 22:00

Also. Informier dich mal über FindWindiw, EnumWindows, EnumChildWindows, WM_GETTEXT, GetDlgItem, FindWindowEx, WM_COMMAND, BM_CLICK.

Quelle: MSDN [http://msdn.microsoft.com/library/default.asp]

Und noch ein hilfreiches Tool: EDA [http://Assarbad.org]

Und am sichersten ist noch das Handle über die ID zu bekommen, da sich diese nicht ändert, im Gegensatz zum Text. Und um Gottes Willen das Handle nicht statisch einprogrammieren, denn das vergibt Windows bei jedem Start des Programmes neu.


Delete - Mo 04.11.02 22:26

Und hier http://www.auq.de/viewtopic.php?t=3677 findest du Code von mir, der einen Button klickt. Ist zwar in der selben Anwendung, was das ganze etwas einfacher macht), aber wie du an das Handle kommst, habe ich dir ja gesagt. (Siehe oben.)

Dieser Thread ist auch noch interessant wegen der Links, die ich gepostet habe: http://www.auq.de/viewtopic.php?t=3353