![]() |
FensterHandle über den Prozess ermitteln
Guten Tag und frohe Ostern,
Hab mal wieder eine kleine Frage, nur leider wees ich nicht ganz wie ich sie formulieren soll. Ich habe ein Programm eben mehrmals auf dem Rechner laufen kann und besitzt auch immer ein anderen Namen. Also schätze ich mal das findwindow dann rausfällt. Zum testen habsch folgenden Code bis jetzt
Delphi-Quellcode:
Dieser Test lief wunderbar. Nun möchte ich mir aber das HWND nicht anhand des Textes holen sondern anhand des Prozesses (Beschreibung) Weil dieser immer gleich ist und der Inhalt von [ und ] immer anders sein kann und er soll es solange wiederholen bis eben alle gefunden wurden.
procedure TForm1.Label1Click(Sender: TObject);
var handle1,handle2: HWND; x,y: String; begin handle1 := FindWindow('wxWindowClassNR', '[123]WheresMyChar'); handle1 := FindWindowEx(handle1, 0, 'wxWindowClassNR', 'ID_PANEL1'); handle1 := FindWindowEx(handle1, 0, 'wxWindowClassNR', 'ID_PANEL2'); handle1 := GetDlgItem(handle1, 532); handle2 := FindWindow('wxWindowClassNR', '[123]WhersMyChar'); handle2 := FindWindowEx(handle2, 0, 'wxWindowClassNR', 'ID_PANEL1'); handle2 := FindWindowEx(handle2, 0, 'wxWindowClassNR', 'ID_PANEL2'); handle2 := GetDlgItem(handle2, 534); if handle1 and handle2 <> 0 then begin x := PCHar('x: ' + GetWinText(handle1)); y := PCHar(' y: ' + GetWinText(handle2)); //Hier wird Code später weitergeführt zur auflistung der Daten end; end; Hoffe ihr konntet mich verstehen, was mein Vorhaben ist! |
Re: GetDlgItem
Wie wäre es mit
![]() ![]() // EDIT1: Nebenbei: Wozu suchst du die selben Handles zweimal? Das ist doch das selbe wie so:
Delphi-Quellcode:
// EDIT2:
handle1 := FindWindow('wxWindowClassNR', '[123]WheresMyChar');
handle1 := FindWindowEx(handle1, 0, 'wxWindowClassNR', 'ID_PANEL1'); handle1 := FindWindowEx(handle1, 0, 'wxWindowClassNR', 'ID_PANEL2'); handle2 := GetDlgItem(handle1, 534); handle1 := GetDlgItem(handle1, 532); Und deine if-Abfrage ist Quatsch... So machst du ein logisches und mit den beiden Handles... |
Re: GetDlgItem
Delphi-Quellcode:
if (handle1 <> INVALID_HANDLE_VALUE) and (handle2 <> INVALID_HANDLE_VALUE) then
|
Re: GetDlgItem
Danke für eure Hilfestellung, werd mal reinschnuppern
Ja ist neuland und da mach ich mir es eben lieber komplizierter als das es gar nicht funzt, werd aber besserung geloben:-P MFG |
Re: GetDlgItem
Äh, was hat das jett mit GetDlgItem zu tun? Dein eigentliches Problem scheint doch zu sein, das Fenster zu finden oder?
|
Re: GetDlgItem
Ich wusste leider nicht wie ich es nennen soll, deshalb habsch einfach mal nen namen aus der Funktion genommen die ich für wichtig hielt! Hoffe ist net so schlimm!
MFG |
Re: GetDlgItem
Schlimm nicht aber blöd. Un dim letzten Absatz hast du doch geschriben was du machen willst: Das fensterhanlde über den Prozess ermitteln.
|
Re: FensterHandle über den Prozess ermitteln
Habs mal geändert wie ein Mann :-P
So hab mich mal ein bisschen von google beraten lassen aber im entdefekt bin ich bei 0 :roll: ![]() ![]() Nur will mein Logisches Denken nicht verstehen wie ich das ![]() ![]() Gibts vlt noch ein Gutes Tutorial (Auf Deutsch) was ich vlt übersehen habe im www und mich mit der Materie etwas mehr vertraut macht? Schon mal danke im Voraus und noch frohe Ostern! MFG PS: OK 0 wäre bissle übertrieben, allgemein anzeigen ist mir klar aber direkt das suchen auf ein spezielles ist mir Bahnhof! |
Re: FensterHandle über den Prozess ermitteln
Zitat:
Nur dass du die Klasse nicht auflisten sondern mit deiner gesuchten Klasse vergleichen willst... |
Re: FensterHandle über den Prozess ermitteln
Also bei Delphi 5 gibt es die Unit TlHelp32, mit der sich ein Schnappschuss der Prozesse machen lässt. Aus dem Schnappschuß kann man dann Prozesse und deren Exe-Namen ermitteln. Natürlich auch die zugehörigen Fenster, aber ersters könnte ja schon reichen.
Hier mal ein Ausschnitt aus meinem Quellcode, denke das sollte fast schon reichen
Delphi-Quellcode:
zum Fenster durchlaufen mal der Ausschnitt:
uses TlHelp32, ShellApi;
var Handle : THandle; Continue : boolean; ProcEntry : TProcessEntry32; i : Integer; begin i := 0; Handle := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0); ProcEntry.dwSize := Sizeof(ProcEntry); // gehe alle Prozesse durch (m.H. der TlHelp32 - Unit) Continue := Process32First(Handle, ProcEntry); while Continue do begin SetLength(TaskListe,i +1); // Daten zum Prozess ermitteln ProcID := ProcEntry.th32ProcessID; Threads := ProcEntry.cntThreads; ExeFile := ProcEntry.szExeFile; if ExeFile = '[System Process]' then ExeFile := 'Leerlaufprozess'; // Nächster Prozess Continue := Process32Next(Handle, ProcEntry); inc(i); end; CloseHandle(Handle);
Delphi-Quellcode:
Die hier erhaltenen Informationen (z.B. ProcID) kann man mit der Information aus dem vorherigen Beispiel verknüpfen.
var
Current : hwnd; i : Integer; begin // Erstes Fenster holen i := 0; Current := GetTopWindow(GetDesktopWindow); while Current <> 0 do begin // Daten zum Fenster ermitteln visible := IsWindowVisible(Current); iconic := IsIconic(Current); handle := Current; parent := GetParent(Current); GetWindowThreadProcessID(Current, ProcID); GetWindowText(Current, Titel, 255); GetClassName(Current, Klasse, 255); // Nächstes Fenster Current := GetNextWindow(Current,GW_HWNDNEXT); inc(i); end; end; Die Variablen, auf die zugewiesen wird, sehen im Beispiel sinnlos aus. Das liegt daran, das ich den Code aus einem Programm ausgeschnitten hab' (da wird auf ein dyn. Record-Array zugewiesen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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-2025 by Thomas Breitkreuz