AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Button fremder Anwendungen drücken
Thema durchsuchen
Ansicht
Themen-Optionen

Button fremder Anwendungen drücken

Offene Frage von "egon.kaschuba"
Ein Thema von egon.kaschuba · begonnen am 18. Dez 2006 · letzter Beitrag vom 20. Dez 2006
Antwort Antwort
egon.kaschuba

Registriert seit: 2. Jun 2006
Ort: Buxtehude
80 Beiträge
 
Delphi 7 Architect
 
#1

Button fremder Anwendungen drücken

  Alt 18. Dez 2006, 18:31



Hallo,

Ich möchte gern den Button fremder Anwendungen ermitteln.

Z.B.: Aus meiner Delphi Anwendung ein fremders Programm aufrufen,und dann dem
Programm eine neue Tastenkomination schicken.

Bekomme aber immer den Hinweis : Inkompatible Typen HWND und Pointer.
Weiß jemand eine lösung des Problems ??


Vielen Dank

Delphi-Quellcode:
   procedure TForm1.Button1Click(Sender: TObject);
    begin

   FindWindowEx(Parent.Handle,nil,nil,nil);

   PostMessage(Handle.Kind,WM_LBUTTONDOWN,MK_LBUTTON,0);
  PostMessage(Handle.Kind,WM_LBUTTONUP,0,0);
 end;
[edit=Christian Seehase]Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit]
Glück ist das einzige was sich verdoppelt,wenn man es teilt.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Button fremder Anwendungen drücken

  Alt 18. Dez 2006, 19:05
Hallo,

um die Button-Handle herauszukriegen wirst Du wahrscheinlich nicht umhinkommen, dir hierfür auch mal das Bei Google suchenSpyXX von Microsoft zu besorgen. Damit kannst Du dann z.B. auch auslesen, über welche Child-Windows der Application Du dich dann u.U. auch entlanghangeln musst bis zu deinem Wunsch-Button (immer schön mittels FindWindowEx). ...Und anstelle von WM_LButtonDown etc. dann event. auch besser gleich die ButtonMessage "BM_Click" abschicken.


edit: Spy++ ist zwar von MS, kostet aber (trotzdem) nix. Das Prog zeigt dir dann z.B. auch den Button-Namen, der ja fürs Suchen per FindWindowEx auch durchaus nützlich/notwendig ist.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Button fremder Anwendungen drücken

  Alt 18. Dez 2006, 19:10
Moin Egon,

als zweiten Parameter erwartet FindWindowEx ein Handle.
Soll hier keines angegeben werden, so muss Du 0 hinschreiben.
Das ist das, was Dir der Compiler anmeckert.

So wie Du es aufrufst, wirst Du damit aber wohl auch nicht glücklich, denn der Rückgabewert von FindWindowEx ist das gesuchte Handle, also solltest Du das auch speichern. Ansonsten wäre der gesamte Funktionsaufruf sinnlos.

Bei Handle.Kind ist wohl ein Dreher drin (Kind.Handle?)

Es könnte so gemeint sein, oder?
Kind.Handle := FindWindowEx(Parent.Handle,0,nil,nil); Wenn es sich bei dem Button um einen "normalen" Button handelt, kannst Du den auch mit der Message MSDN-Library durchsuchenBM_CLICK ansprechen, was sicherer funkioniert als einen Mausklick zu simulieren.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
18. Dez 2006, 19:11
Dieses Thema wurde von "Christian Seehase" von "Multimedia" nach "Windows API / MS.NET Framework API" verschoben.
Eher ein API-Problem
egon.kaschuba

Registriert seit: 2. Jun 2006
Ort: Buxtehude
80 Beiträge
 
Delphi 7 Architect
 
#5

Re: Button fremder Anwendungen drücken

  Alt 18. Dez 2006, 19:39

Hallo Chris,
mit der null war schon OK.

PostMessage(Handle.Kind .... u.s.w Schuss innen Ofen.

Aber nu kommt Record,Object oder Klassentyp erforderlich.
Alle meine Kinder hab ich hin und her getauscht
Verzei: Bin ich zu dusselig oder macht das, daß Alter ????
Glück ist das einzige was sich verdoppelt,wenn man es teilt.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Button fremder Anwendungen drücken

  Alt 18. Dez 2006, 23:31
Moin Egon,

ich denke mal, es macht die mangelnde Erfahrung...

Zum einen:
Wie ist denn bei Dir Handle, das Du in PostMessage verwendet hast, deklariert?

Allerdings möchte ich mich auch noch einmal vergewissern, dass das was Du da geschrieben hast, auch das ist, was Du willst:

Als ersten Parameter von FindWindowEx verwendest Du Parent.Handle.
Da Du Dich in einer Methode von Form1 befindest, und ein Formular eine Eigenschaft Parent hat, übergibst Du den Wert des Handles des Parents von Form1, was, i.d.R. dem Application-Window der Anwendung entspricht.
Jedes VCL-Programm hat als oberste Ebene ein unsichtbares Application-Window, das als Parent für die Unterfenster (Form1...) dient, solange man nicht manuell eingreift.

Da Du ja den Button einer Fremdandwendung ansprechen willst, bin ich mir also nicht ganz sicher, ob das so sein soll, zumal sich auf dem Fenster garantiert kein Button befindet.

Um einen bestimmten Button in einer Fremdanwendung zu finden, wirst Du wahrscheinlich mit Hier im Forum suchenEnumChildWindows weiterkommen.
Das Handle mittels eines anderen Tools auszulesen hilft Dir zur Laufzeit Deines Programmes nicht viel weiter, da sich der Wert bei jedem Erzeugen des Buttons ändern kann.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Button fremder Anwendungen drücken

  Alt 19. Dez 2006, 09:54
...also, hier vielleicht doch mal ein Mini-Beispiel das zeigt, wie absolut einfach das auch mit FindWindowEx sein kann.

Angenommen Du möchtest die Pie-Button auf deinem Taschenrechner-Prog ferngesteuert niederdrücken, dann reicht nämlich schon ungefähr folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var RechnerHwnd, PiTasteHwnd : THandle;
begin
  RechnerHwnd := FindWindow('SciCalc','Rechner');
  if RechnerHwnd > 0 then
    PiTasteHwnd := FindWindowEx(RechnerHwnd,0,'Button','Pi');

  if (RechnerHwnd > 0) and (PiTasteHwnd > 0)
  then PostMessage(PiTasteHwnd,BM_Click,0,0)
  else showMessage('..klappte nicht!');
end;
Vorher schaust Du dir aber noch mittels Spy++ (=SpyXX) die einfache Control-Struktur des Progs an, ...und siehst dabei zufällig, dass nicht nur der Taschenrechner schon einen sinnvollen Namen (='Rechner') hat, sondern dass ’günstigerweise’ auch die Buttons darauf ihren Funktionen entsprechend benannt sind. Außerdem kannst du auch nur mittels eines solchen Tools die ebenfalls noch benötigten Klassennamen von Prog u. Button herausbekommen.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Button fremder Anwendungen drücken

  Alt 19. Dez 2006, 10:06
Ich hatte doch per email als Antwort auf die Anfrage zur MP3 Ausgabe ein Stück
Quellcode geschickt, welcher genau dieses macht.
Funktioniert, einfach kopieren.


Gruß Peter
  Mit Zitat antworten Zitat
egon.kaschuba

Registriert seit: 2. Jun 2006
Ort: Buxtehude
80 Beiträge
 
Delphi 7 Architect
 
#9

Re: Button fremder Anwendungen drücken

  Alt 20. Dez 2006, 21:14

Hallo an alle drei,

habe das Problem gelöst.

Vielen Dank und frohe Weihnachten

Gruß egon
Glück ist das einzige was sich verdoppelt,wenn man es teilt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz