Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fenster einer fremden Anwendung auswählen und hWnd erhalten? (https://www.delphipraxis.net/164108-fenster-einer-fremden-anwendung-auswaehlen-und-hwnd-erhalten.html)

resolution 28. Okt 2011 19:24

Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Hallo,

ich möchte eine kleine Anwendung schreiben die regelmäßig Screenshots von einer zuvor ausgewählten Anwendung macht.
Das Problem ist aber das Auswählen der Anwendung, was ich gern über die Maus tun möchte. Erträumt hab ich mir eine Art Drag'n'Drop, der Benutzer soll ein Bildchen von meiner Anwendung auf die Ziel-Anwendung ziehen. Hier scheitere ich aber, habe es versucht mit den Drag and Drop components von Anders Melander zu realisieren, aber ich stehe jetzt an einer Stelle wo ich nicht weiß wie ich an das Handle komme wo ich gedroppt habe ;)

Ich könnte mir auch vorstellen, dass ich mit der Maus in die Zielanwendung klicke, es soll aber keine Prüfung werden, welches Fenster dann in den Vordergrund gerufen wird - sonst bekomme ich evtl das handle einer Anwendung die sich kurz vorher selbst in den vordergrund geschalten hat :)

Hat jemand Vorschläge / Stichwörter, wo ich mich schlau machen müsste?

Auch das 'Drag'n'Drop' des Bildes ist wohl nicht so ohne, Screen.Cursor funktioniert ja nur im Formular meiner Anwendung.. :/

Vielen Dank :)

Luckie 28. Okt 2011 19:25

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Guck dir das mal an: http://www.michael-puff.de/Programmi...lphi/Programme -> WindowInfo.zip

gORDon_vdLg 1. Nov 2011 20:01

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Möglicherweise hilft dir diese Funktion weiter. Sie gibt dir ein Fenster Handle zurück das sich an der per Parameter angegeben Position befindet, hier kann man zum Beispiel die Mausposition angeben.

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

zeras 1. Nov 2011 20:12

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich mache das, indem ich die Maus auf den Fenstertitel halte. Nach 5 Sekunden bekomme ich dann das handle. Das habe ich irgendwo zusammenkopiert. Vielleicht hilft es.
Damit mache ich Screenshots von allem, was ich vorher mal mit der Maus gezeigt hatte.

Delphi-Quellcode:
var
   buffer: array [0..255] of Char;
   p: TPoint;

begin
  Caption:= '';
  GetCursorPos(p);
  GetClassName(WindowFromPoint(p), buffer, length(buffer));
  Caption:= 'Classname: '+ string(buffer);

  //wir können 2 verschiedene Fenster suchen lassen
  if RBWindowSearch1.Checked then begin
    EClassName1.Text:=string(buffer);
  end
  else begin
    EClassName2.Text:=string(buffer);
  end;

  GetWindowText(WindowFromPoint(p), buffer, length(buffer));
  Caption:= Caption+ '  WindowText: '+ string(buffer);
  beep;
  Timer1.Enabled:=False;
  caption:=fMain.HeadCaption; //Kopf wieder mit Ori beschreiben
  BtnStart2FindClass.Enabled:=True;
end;

resolution 4. Nov 2011 23:11

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Hallo :)

Luckie's Programm mit Source ist sehr nützlich und enthält auch alles was man benötigt - vielen Dank :)

Allerdings habe ich noch einige Probleme, das für mich zu nutzen - habe es noch nicht geschafft die Windows-Messages an mein Programm weiter zu leiten, das WindowInfo ist ja sehr Pascal'ig ;) Vielleicht komme ich am WE weiter :)

Danke und viele Grüße,
Manuel

gORDon_vdLg 4. Nov 2011 23:34

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Du kannst mittels GetWindowLong bzw. SetWindowLong die Window Proc ganz einfach Winapi-mäßig hooken oder detouren. Das würde ich mir mal ansehen. Gucks dir mal im MSDN an, interessant ist für dich dann das Flag GWL_WNDPROC. Detour wäre da sogar weniger empfehlenswert bzw. unnötig kompliziert weils da echt einfach per Winapi machbar ist.

Luckie 5. Nov 2011 02:26

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Warum sollte er für einen Screenshot die Windows Procedure hooken? Handle vom Fenster holen, dazu den DC ermitteln und das ganze in eine Bitmap mit BitBlt kopieren. Mit dem Bitmap kann man dann machen, was man will. Einzige Problem, man muss das Elternfenster erwischen, sonst hat man eventuell nur einen Screenshot von einem Steuerelement. ;)

gORDon_vdLg 5. Nov 2011 14:46

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Naja er schrieb doch das er irgendwelche Windowmessages abfangen will.

Luckie 5. Nov 2011 14:50

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Das heißt aber nicht, dass das für sein Vorhaben nötig ist. Oder ich habe ihn falsch verstanden.

gORDon_vdLg 5. Nov 2011 14:56

AW: Fenster einer fremden Anwendung auswählen und hWnd erhalten?
 
Das stimmt schon, für Screenshots ist das quatsch. Aber ich dacht ich schreib es mal wenn er schon fragt, wer weiß was er noch so vor hat?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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