Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi programm, das ein programm bedient? (https://www.delphipraxis.net/70918-programm-das-ein-programm-bedient.html)

toredo 6. Jun 2006 21:01


programm, das ein programm bedient?
 
hay,

ich muss bzw. möchte ein programm schreiben, dass auf befehl eine exe im hintergrund startet und bei der dann bei ner checkbox das häckchen setzt, dann bei ner combobox ein anderes item auswählt und dann wieder das häckchen bei der checkbox entfernt. schlussendlich muss es dann noch auf übernehmen und ok klicken.

ich hoffe das ist realisierbar, ansonsten ists auch ned soo schlimm, aber es wäre schon geil.


mfG toredo

arbu man 6. Jun 2006 21:07

Re: programm, das ein programm bedient?
 
Du btauchst erst mal das Fenster Handle such mal nach FindWindow der rest ist dann einfach da sollte ein api tutorial helfen

toredo 6. Jun 2006 21:25

Re: programm, das ein programm bedient?
 
hay,

zu dem stichwort findwindows hab ich unter dsdt was gefunden:
Delphi-Quellcode:
type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = record
    Caption: string;
    ClassName: String;
    WindowHandle: THandle;
end;

function EnumWindowsProc(hWindow: hWnd; lParam: LongInt): boolean; stdcall;
var lpBuffer: PChar;
    WindowCaptionFound: boolean;
    ClassNameFound: boolean;
begin
  GetMem(lpBuffer, 255);
  result:=true;
  WindowCaptionFound:=false;
  ClassNameFound:=false;
  try
    if GetWindowText(hWindow, lpBuffer,255)>0 then
      if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer))>0
      then WindowCaptionFound:=true;
    if PFindWindowStruct(lParam).ClassName='' then
      ClassNameFound:=true
      else if GetClassName(hWindow, lpBuffer, 255)>0 then
        if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))>0
        then ClassNameFound:=true;
    if (WindowCaptionFound and ClassNameFound) then begin
      PFindWindowStruct(lParam).WindowHandle:=hWindow;
      result:=false;
    end;
  finally
    FreeMem(lpBuffer, sizeof(lpBuffer^));
  end;
end;

function FindAWindow(WinCaption: string; WinClassName: string): THandle;
var WindowInfo: TFindWindowStruct;
begin
  with WindowInfo do begin
    caption := WinCaption;
    className := WinClassName;
    WindowHandle := 0;
    EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
    result := WindowHandle;
  end;
end;

procedure TForm1.Button1Click(sender: TObject);
var TheWindowHandle: THandle;
begin
  TheWindowHandle:=FindAWindow('Netscape -', '');
  if TheWindowHandle=0 then
    ShowMessage('Window not found!')
  else
    BringWindowToTop(TheWindowHandle);
end;
aber wo kommt da der code rein der für das fenster gillt, falls es existiert?
und den code für das "fremde" fenster kann ich auch normal benutzen z.b. combobox1.text:='blabla';, aber ich weiss bei dem fenster ja nicht wie die objekte heissen.
ich weiss nicht mal in welcher sprache das programm gecodet wurde...




mfG toredo

jfheins 6. Jun 2006 21:32

Re: programm, das ein programm bedient?
 
MSDN-Library durchsuchenFindWindow ist eigentlich eie API-Funktion - aber so wirds wahrscheinlich auch gehen ;)

Du musst im Grunde Die richtigen Controls finden (FindWindow & Co) und dann die richtige Message schicken (Send/PostMessage).
Für nen Button wäre dass bspw. MSDN-Library durchsuchenBM_CLICK

Für ne Combobox oder ne Checkbox weis ich jetzt grad' nicht, müsste aber auf jeden Fall im msdn stehen :mrgreen:

Also eigentlich ganz einfach :zwinker:

(Wenn man jetzt noch Vieren davon abhalten könnte, dein Antivirus-Prog so fernzusteuern ... ^^)

Also mal kurz geguckt:

Button: http://msdn.microsoft.com/library/de...s/bm_click.asp

ComboBox: http://msdn.microsoft.com/library/de...lectstring.asp

CheckBox: Ist auch nur ein Button ;)

arbu man 6. Jun 2006 21:37

Re: programm, das ein programm bedient?
 
Delphi-Quellcode:
procedure TForm1.Button1Click(sender: TObject);
var TheWindowHandle: THandle;
begin
  TheWindowHandle:=FindAWindow('Title', '');
  if TheWindowHandle=0 then
    ShowMessage('Window not found!')
  else
    BringWindowToTop(TheWindowHandle);
end;
Wo Title steht setzt du den Title des ProgrammFensters ein. Dann hast du in TheWindowHandle das Handle des Fensters dann musst du noch mit EnumChildWindows die Unter fenster auflisten, auch eine combobox ist ein fenster! es gibt auch eine api funktion um die caption herruaszu finden (foren suche) damit könntest du die caption der checkbox herraus finden und dann suchen wie man eine checkbox über api setzt. alles ohne gewähr (aber mit pistole).
Auf jeden fall ist ein api tutorial wie das von luckie hilfreich.

Bernhard Geyer 6. Jun 2006 22:00

Re: programm, das ein programm bedient?
 
Wenns zum automatischen Programmtest ist: TestComplete

toredo 7. Jun 2006 18:10

Re: programm, das ein programm bedient?
 
wow, das wird ja immer kompilizierter :o

Zitat:

Zitat von arbu man
Delphi-Quellcode:
procedure TForm1.Button1Click(sender: TObject);
var TheWindowHandle: THandle;
begin
  TheWindowHandle:=FindAWindow('Title', '');
  if TheWindowHandle=0 then
    ShowMessage('Window not found!')
  else
    BringWindowToTop(TheWindowHandle);
end;
Wo Title steht setzt du den Title des ProgrammFensters ein....

bis hier hin versteh ich das ganze noch so halbwegs.


das prob ist auch noch ich kann die exe zuhause ned ausführen, da man dazu ein programm auf dem pc bräuchte, das ich aber nicht habe und es wäre auch ned legal, ne raubkopie zu machen.

aber vielleicht kann man ja aus der exe heraus diese daten lesen, vielleicht mit nem resource hacker oder so was?

vielleicht könnte mri die function auch jemand machen, ich würde dieser person auch was als gegenleistung geben.


mfG toredo

arbu man 7. Jun 2006 19:10

Re: programm, das ein programm bedient?
 
Mit einen Res Hacker geht da auch nicht viel Handles werden dyn. erstellt d.h. bei jeden start hast du andere Handles

Es sei denn die Formulardaten stehen in der exe dann ist es einfach

toredo 7. Jun 2006 20:26

Re: programm, das ein programm bedient?
 
hat jemand zufälligerwiese ein beispiel oder ein tut für das ganze?
also die funktion um das fenster zu finden schaff ich wahrscheinlich noch aber den rest ned...


mfG toredo

inherited 7. Jun 2006 20:51

Re: programm, das ein programm bedient?
 
Schau mal im Tutorial-Bereich ;)
:corky:

jfheins 7. Jun 2006 20:54

Re: programm, das ein programm bedient?
 
Was ist denn jetzt genau dein Problem ?

Du musst die einzelnen Handles der Combobox, checkbox und des Buttons finden und die oben geposteten Messages an diese Handles senden ...

toredo 7. Jun 2006 21:11

Re: programm, das ein programm bedient?
 
bei dem finden der handles hab ich probs und bei dme senden der messages.

ich bin halt (leider noch(?)) ein anfänger :oops:



mfG toredo

jfheins 7. Jun 2006 22:15

Re: programm, das ein programm bedient?
 
Zum Finden der Handles kannst du z.b. Hier im Forum suchenWinSpy verwenden, das kann dir gleich ein wenig code generieren ... ;)

Das senden der Messages ist einfach - SendMessage(Handle, Message_siehe_oben, w&lparam_sieh link oben) - wenn du willst kann ich die drei aufrufe auch noch hinkloppen ... dann müsstest du mir aber z.B. noch sagen, wie das Item der Combobox heißt ;)

toredo 8. Jun 2006 12:02

Re: programm, das ein programm bedient?
 
hay,

das standartitem der combobox heisst "Automatisch starten", das soll, wenn es noch nicht so ist, auf "Manuell starten" geändert werden. mit einer zweiten funktion halt andersrum.
die checkbox die auch an- und abgekreuzt werden muss heisst "Symbol in Task-Leiste anzeigen".
der titel des fenster ist Eigenschaften, aber ich glaube das braucht man ja nur um das fenster zu finden.

winspy werd ich mir mal saugen und anschauen.

grosses dankeschön für die hilfe,


mfG toredo

toredo 9. Jun 2006 20:55

Re: programm, das ein programm bedient?
 
öhm, kannst du mir jetzt trozdem ned helfen?
ist auch ned so schlimm, dann mach ich halt ne anleitung für das was ich amchen wollte, ist ja auch end so schlimm, eventuel schaff ichs auch noch.


trotzdem vielen dank für die hilfe bis jetzt.


mfG toredo

jfheins 20. Jun 2006 22:22

Re: programm, das ein programm bedient?
 
Oh, muss ich wohl übersehen haben ^^

Also:

CheckBox:
Delphi-Quellcode:
SendMessage(Handle, BM_SETCHECK, 1, 0); // gecheckt
SendMessage(Handle, BM_SETCHECK, 0, 0); // ungecheckt
Combobox:
Delphi-Quellcode:
SendMessage(Handle, CB_SELECTSTRING, 1, PChar('Manuell starten')); //ausgewählt
Button:
Delphi-Quellcode:
SendMessage(Handle, BM_CLICK, 0, 0); // geklickt
Die Handles musste dir halt suchen, da hilft dir z.B. WinSpy ;)

toredo 21. Jun 2006 18:30

Re: programm, das ein programm bedient?
 
wred ich gleich ausprobieren.
thx


mfG toredo


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 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 by Thomas Breitkreuz