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 FindWindow - gefundenes Fenster anzeigen und weitergeben (https://www.delphipraxis.net/125416-findwindow-gefundenes-fenster-anzeigen-und-weitergeben.html)

Lostriga 5. Dez 2008 20:35


FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Sorry .. falsches Unterforum >.<


Aloa,

ich bin gerade am programmieren eines Tools.
Dieses habe ich auch schon fast fertig gestellt .. bis auf eine Funktion!

Ich erkläre das Programm besser erst mal. Als erstes das wichtigste Stück vom Source.

Delphi-Quellcode:
procedure TForm1.Timer51Timer(Sender: TObject);
var
Hwnd : THandle;
dwKey : DWord;
begin
Hwnd          := FindWindow('Nil, 'Word');
dwKey         := Ord('C');
myPostMessageA(Hwnd, WM_KEYDOWN, dwKey, MapVirtualKey(dwKey, 0));
myPostMessageA(Hwnd, WM_KEYUP, dwKey, MapVirtualKey(dwKey, 0));
end;
Hiermit wird ja (ich habe einfach mal Word genommen) das Programm Word gesucht, gefunden, die Taste C gedrückt und anschließend wieder los gelassen.


Nun kommt der Teil der noch fehlt und auf den ich auch einfach nicht komme, Google wird mich schon als Extrem Spam Searcher kennen (Ironie).

So wie meine Prozedur zur Zeit aussieht, fragt der Timer immer wieder nach ob Word da ist, er findet es auch, aber was ist wenn ich Word 2 mal öffne, ja dann wird immer das Word gefunden, was vor dem 2ten liegt.

Deshalb möchte ich gern einen Button einbauen und auf diesen FindWindow setzen, der ohne Schleife fungiert.
Da jedes Programm (in diesem Fall Word) eine ID/Parameter/Prozessnummer/.. hat, möchte ich das diese, nach dem Klick auf dem Button, in einem Editfeld angezeigt wird.
Jetzt kommt nun wieder der Timer in´s Spiel, da dieser ja nun kein FindWindow mehr hat, soll er jetzt die ID/Para.. aus dem Editfeld lesen und somit zu 100% den Tastendruck immer an das richtige Word senden, egal ob es im Vorder- oder Hindergrund ist.



So ich denk mal jetzt wisst ihr wo rum es mir geht ^^.

Ich bitte um eure Hilfe, und hoffe das einer so etwas schon mal gemacht/gesehen hat oder eine andere Möglichkeit kennt mit gleichem Effekt.


mfg

Lostriga

toms 6. Dez 2008 09:06

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Zitat:

Da jedes Programm (in diesem Fall Word) eine ID/Parameter/Prozessnummer/.. hat, möchte ich das diese, nach dem Klick auf dem Button, in einem Editfeld angezeigt wird.
Hallo

Ich verstehe nicht ganz den Sinn des Buttons. Wenn mehrere Instanzen offen sind, wie wird entschieden, welche genommen werden soll?

Lostriga 6. Dez 2008 11:04

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Ähm ja .. habe gemerkt das ich mich selber ein bisschen falsch ausgedrückt habe.

Beim weiteren googeln habe ich zwar keine Lösung gefunden, aber eine Art der besseren Beschreibung.

Wenn man mit FindWindow ein Fenster findet (in diesem Fall war es ja Word), findet diese Funktion IMMER das Word, was sich im Vordergund befindet, d.h. hat man 2 mal Word geöffnet findet FindWindow dieses was sich vor dem anderen befindet.
Holt man das 2te Word vor das erste, wird das 2te Word gefunden weil es vor dem Ersten ist.

Da jedes Programm ein Handle hat, welches sich bei jedem Programmstart ändert, möchte ich gern dieses, mit FindWindow, gefundene Handle in ein Editfeld übertragen, womit ich somit das Handle des einen Word sehen kann.
Der Timer soll dann das Handle nicht mehr aus dem FindWindow nehmen, sondern die "ID" die in das Editfeld übertragen wurde.
Somit kann ich dann nämlich sagen, er soll genau dieses Word mit dieser ID benutzen, womit ich das andere Word in den Vordergrund holen kann, dieses aber nicht gefunden wird..
Erst wenn ich den Button erneut klicke, kann das Word was sich im Vordergrund befindet gefunden werden, womit dann dessen Handle in das Editfeld übertragen wird und der Timer dann diese ID benutzt.

toms 6. Dez 2008 11:07

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Warum verwendest du nicht EnumWindows()?
Diese Funktion enumeriert alle Toplevel-Fenster und gibt deren Fensterhandle zurück.

Lostriga 6. Dez 2008 11:34

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Habe eben mal gegoogelt und das gefunden:

http://209.85.129.132/search?q=cache...lnk&cd=1&gl=de

Auch von dieser Site ^^.


Zitat:

Die Unit EnumWindowUtil im Anhang enthält eine Kapselung für die Windows-API Funktionen
EnumWindows, EnumChildWindows, EnumDesktopWindows, EnumThreadWindows und EnumWindowStations.
Es handelt sich dabei um eine Klasse, die von TStringList abgeleitet wurde.
Folgendes Beispiel zeigt, wie einfach man damit arbeiten kann:
Delphi-Quellcode:
var
  wlist : TWindowList;
begin
  wlist := TWindowList.Create; // Objekt erzeugen
  try
    wlist.AddClassname := True;  // zusätzlich den Windows-Classname anfügen
    wlist.EnumTopLevelWindows;   // Alle Windows auflisten
    ListBox1.Items.Assign(wlist); // Ergebnis in eine Listbox kopieren
  finally
    wlist.Free;
  end;
end;
Natürlich kann man so nicht nur den WindowsText (Caption des Window) abfragen, sondern man
kommt auch ganz einfach an die Handles der Windows heran.
(Der Trick dabei ist, dass die Handles intern im Property Objects[] gespeichert werden)

Delphi-Quellcode:
// Alle Fenster minimieren
for i := 0 to wlist.Count-1 do
begin
  ShowWindow(wlist.Handles[i], SW_MINIMIZE);
end;

Aber Delphi sagt immer das TWindowList ein undefinierbarer Bezeichner ist.

toms 6. Dez 2008 11:37

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Zitat:

Die Unit EnumWindowUtil im Anhang enthält eine Kapselung für die Windows-API Funktionen
Dieser Typ wird wohl in EnumWindowUtil.pas deklariert sein!

http://www.delphipraxis.net/internal...t.php?p=210747

DP-Maintenance 6. Dez 2008 14:00

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Multimedia" nach "Windows API / MS.NET Framework API" verschoben.

Lostriga 7. Dez 2008 15:06

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Habs jetzt immer versucht .. aber ich bekomme es nicht hin. :coder2:

Kann mir da bitte vielleicht einer so ne kurze Demo oder so machen die alle Handles anzeigt? Ich verzweifle. :cry:

API 7. Dez 2008 15:49

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Ein Beispiel steht ja in #5..oder wo genau kommst du nicht weiter?

Lostriga 11. Dez 2008 15:20

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben
 
Ok kann geclosed werden .. habe mir doch etwas zusammen basteln können was auch einmanfrei funktioniert!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Handle := FindWindow('D3D Window', '....');
Listbox1.Items.Clear;
  EnumWindows(@EnumWinProc, DWord(Listbox));
If Listbox1.Items.Text = '' Then
Button1.Enabled := True
Else begin
Edit1.Enabled := True;
Combobox1.Enabled := True;
Button1.Enabled := False;
Button2.Enabled := True;
end;
end;

procedure TForm1.Bot1StopClick(Sender: TObject);
begin
Button1.Enabled := True;
Listbox1.Clear;
Button2.Enabled := False;
Edit1.Enabled := False;;
Combobox1.Enabled := False;
Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
dwKey : DWord;
begin
  if (Combobox1.ItemIndex <> -1) then
  begin
    dwKey         := VK_F1 + Combobox1.ItemIndex;
    myPostMessageA(Handle1, WM_KEYDOWN, dwKey, MapVirtualKey(dwKey, 0));
  end;
end;
An dich toms, einliebes Dankeschön für das Enumwindows.


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