Anderes Programm steuern

Für Fragen von Einsteigern und Programmieranfängern...
felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Anderes Programm steuern

Beitrag von felix96 »

Hallo, habe grad (wie immer)
ein Problem, und zwar möchte ich in einem anderen Programm (unsichtbar) Mausklicks ausführen.
Hier erst mal mein Code:

Code: Alles auswählen

p:=tprocess.create(nil);
      p.CommandLine:='c:\programme\mozilla firefox\firefox.exe';
      p.ShowWindow:=swohide;
      p.Execute;
      hu:=p.Handle;
So, jetzt würde ich gerne hier klicken lassen.
habs schon mit
PostMessage(h,MOUSEEVENTF_RIGHTDOWN,x,y);
versucht, aber es funktionirt nicht.
_X_ hat schon gesagt, dass man das Package mouseandkeyinput verwenden muss.
Hier bin ich aber daran verzweifelt, dass ich es nicht einbinden konnte.
Also ich gehe auf Projekt>Projekt Inspector>+>Neue Anforderung.
Hier gebe ich mouseandkeyinput ein, und sehe die Fehlermeldung "Package nicht gefunden"
Wisst ihr wie es funktioniren könnte?

P.S. Windows
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Anderes Programm steuern

Beitrag von Socke »

felix96 hat geschrieben:PostMessage(h,MOUSEEVENTF_RIGHTDOWN,x,y);
Ich nehme mal an, du meinst hu und nicht nur h als Handle;
In dem Falle tippe ich darauf, dass TProcess.Handle ein Handle auf das Programm liefert (sowas, wie die Prozess-ID, kann aber auch ein echtes Handle sein).
Nur kann ein Prozess keine Maus-Klicks verarbeiten. Die werden in einer Botschaftenschleife des Programms abgearbeitet. Daher brauchst du ein passendes Handle des Formulars, welches die Klicks erhalten soll und an dieses Handle sendest du deine Messages. (Tipp: Google und Fenster Windows Handle).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Dazu findet Google diesen Code:

Code: Alles auswählen

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;
Dort hapert es aber hier:
if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer))>0
then WindowCaptionFound:=true;
Fehler: unit1.pas(50,40) Error: Illegal qualifier
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Bei diesem Code findet das Proframm nie ein handle:
h:=findwindow(pchar(edit1.Text),nil); //text= Mozilla Firefox, Firefox u.s.w.
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Habs mit IE hingekrigt, FindWindow('ieframe',nil);
kann aber immer noch nicht mi der maus klicken :-(
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Habe jetzt auch nocht das Tool WinSpy gefunden, damit weis ich auch das handle von Firefox.
Kann aber immer noch nicht die Maus klicken lassen :cry:
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Anderes Programm steuern

Beitrag von Socke »

Da du dich mit der Win-API außerhalb meines Wissengebietes begibst, rate ich mal, dass du die falsche Message sendest.
Funktioniert denn bspw. das BringWindowToTop()?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Jup,
der Code:

Code: Alles auswählen

var wndMai : HWND;
begin
  wndMain := FindWindow('MozillaUIWindowClass',nil);
  if wndMain <> 0 then BringWindowToTop(wndmain);
Bringt Firefox nach vorne
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Anderes Programm steuern

Beitrag von carli »

Wahrscheinlich hat der Firefox einfach gewisse Sicherheitsstandards (die beim IE fehlen), dass er den Klick nur dann akzeptiert, wenn die Maus vorher an diese Stelle wirklich bewegt wurde.

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Beim IE funktionirts ja auch nicht, hier hatte ich nur des Handle.

P.S.
Ich glaube ehr, der Code zum Mausbewegen ist falsch, denn der war nur geraten
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Anderes Programm steuern

Beitrag von carli »

Dann nutze doch die Seite, um zu erfahren, wie die Message Loop wirklich aussieht: http://en.wikipedia.org/wiki/Message_lo ... ft_Windows" onclick="window.open(this.href);return false;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Anderes Programm steuern

Beitrag von Socke »

felix96 hat geschrieben:Ich glaube ehr, der Code zum Mausbewegen ist falsch, denn der war nur geraten
Socke hat geschrieben:(...] rate ich mal, dass du die falsche Message sendest.
Die Message "MOUSEEVENTF_RIGHTDOWN" kenne ich nicht, zumal alle mir bekannten Windows-Message-Konstanten der Form WM_<Name> folgen. Der Wert, den google zu dieser Konstante ausgibt (8) entspricht der WM_KILLFOCUS, könnte also genau das erreichen.
Wenn du einen Klick mit der rechten Maustaste simulieren willst, versuch's mal mit den beiden Messages (ein Klick benötigt immer zwei Messages):

Code: Alles auswählen

WM_RBUTTONDOWN = 0x204
WM_RBUTTONUP = 0x205
Eine volle Liste aller Messages müsstest du in der Unit Windows oder unter http://www.autohotkey.com/docs/misc/SendMessageList.htm finden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Danke, kann bis jetzt aber nur das mainmenu von Firefox anklicken :?:

es ist wie als würe hier:

Code: Alles auswählen

SendMessage(h,WM_LBUTTONDOWN,x,y); sleep(20);
  SendMessage(h,WM_LBUTTONUP,x,y);
nur y gezält werden würde, und zwar als x :?: :?:

P.S. bie PostMessage ist es das gleiche.
P.S.(2) wenn ich die Arbeistsfläche angebe, kann ich in dieser irgendwie klicken, aber nicht auf das, was unter der Maus ist (mouse.curserpos)
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Anderes Programm steuern

Beitrag von Socke »

felix96 hat geschrieben:Danke, kann bis jetzt aber nur das mainmenu von Firefox anklicken :?:

es ist wie als würe hier:

Code: Alles auswählen

SendMessage(h,WM_LBUTTONDOWN,x,y); sleep(20);
  SendMessage(h,WM_LBUTTONUP,x,y);
nur y gezält werden würde, und zwar als x :?: :?:

P.S. bie PostMessage ist es das gleiche.
P.S.(2) wenn ich die Arbeistsfläche angebe, kann ich in dieser irgendwie klicken, aber nicht auf das, was unter der Maus ist (mouse.curserpos)
Evtl. hast du die Parameter falsch herum angegeben. Näheres findest du bei MSDN. Der Unterschied zwischen Post- und SendMessage war doch, dass das eine asynchron ist und das andere nicht. Es sollte also bei beiden das selbe passieren, nur dass dein Programm u.u. darauf wartet, dass die Messages bearbeitet/gesendet wurden.

Ich kann mir auch vorstellen, dass du unter Umständen die Message direkt an einen zu klickenden Button senden musst; der hat schließlich sein eigenes Handle. Aber das ist rein spekulativ.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Anderes Programm steuern

Beitrag von felix96 »

Nein, z.B. der "Meistbesuchte Seiten" Button hat leider kein eigenes Handle :cry:
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Antworten