AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi FindWindow - gefundenes Fenster anzeigen und weitergeben
Thema durchsuchen
Ansicht
Themen-Optionen

FindWindow - gefundenes Fenster anzeigen und weitergeben

Ein Thema von Lostriga · begonnen am 5. Dez 2008 · letzter Beitrag vom 11. Dez 2008
Antwort Antwort
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#1

FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 5. Dez 2008, 19:35
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 6. Dez 2008, 08:06
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?
Thomas
  Mit Zitat antworten Zitat
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#3

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 6. Dez 2008, 10:04
Ä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.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 6. Dez 2008, 10:07
Warum verwendest du nicht EnumWindows()?
Diese Funktion enumeriert alle Toplevel-Fenster und gibt deren Fensterhandle zurück.
Thomas
  Mit Zitat antworten Zitat
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#5

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 6. Dez 2008, 10:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#6

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 6. Dez 2008, 10:37
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
Thomas
  Mit Zitat antworten Zitat
6. Dez 2008, 13:00
Dieses Thema wurde von "SirThornberry" von "Multimedia" nach "Windows API / MS.NET Framework API" verschoben.
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#8

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 7. Dez 2008, 14:06
Habs jetzt immer versucht .. aber ich bekomme es nicht hin.

Kann mir da bitte vielleicht einer so ne kurze Demo oder so machen die alle Handles anzeigt? Ich verzweifle.
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#9

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 7. Dez 2008, 14:49
Ein Beispiel steht ja in #5..oder wo genau kommst du nicht weiter?
  Mit Zitat antworten Zitat
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#10

Re: FindWindow - gefundenes Fenster anzeigen und weitergeben

  Alt 11. Dez 2008, 14:20
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.
  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 11:35 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