AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Prozess-Handle vs. Fenster-Handle
Thema durchsuchen
Ansicht
Themen-Optionen

Prozess-Handle vs. Fenster-Handle

Ein Thema von Chewie · begonnen am 26. Jul 2002 · letzter Beitrag vom 9. Aug 2002
Antwort Antwort
Seite 1 von 2  1 2      
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

Prozess-Handle vs. Fenster-Handle

  Alt 26. Jul 2002, 00:56
Nabend. Ich hab folgendes Problem:
Ich habe die PID eines Prozess und will nun das Handle des Hauptfensters, sodass ich dieses z. B. in ShowWindow verwenden kann. Wie kann ich das machen?
Ich kann mir ja mit OpenProcess ein Handle auf den Prozess holen, aber mit diesem Handle kann ich das Hauptfenster ja nicht verändern. Wäre super, wenn ihr mir helfen könntet.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 26. Jul 2002, 02:13
Wenn du dir die ThreadID vom Prozess besorgen kannst, dann kannst du mit EnumThreadWindows alle Hauptfenster des Prozesses ermitteln.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 26. Jul 2002, 12:48
Hmm, leider krieg ich das nicht hin. Ich habs jetzt mal so gemacht, dass ich die PID, die ich über einen Snapshot und dann die Process32First bzw -Next-Funktionen bekommen mit th32OwnerProcessID von einem TThread32Entry vergleiche, solange, bis es zu einer Übereinstimmung kommt. Das tut es aber leider nicht. Wie muss ich sowas richtig machen?

Edit: Das tuts doch. Meine Funktion, die das erledigt, war wohl falsch. Jedenfalls habe ich jetzt die ThreadID (ich glaub zumindest, dass es die Richtige ist). Ich wag mich jetzt mal an EnumThreadWindow ran.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 26. Jul 2002, 18:23
Ne, ich versteh das bei EnumThreadWindows nicht. Variablen-Pointer sind mir inzwischen zwar geläufig, aber Funktions-Pointer sind für mich leider noch ne andere Welt. Kann mir da einer helfen?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5
  Alt 26. Jul 2002, 20:20
Mal ein Beispiel:
Code:
function EnumThreadWndProc(wnd: HWND; Items: TStrings): Boolean; stdcall;
var
  Buf: array[0..1024] of Char;
  WndCaption: string;
begin
  SetString(WndCaption, Buf, GetWindowText(wnd, Buf));
  Items.Add(WndCaption);

  Result := True; // nächstes Fenster;
end;

begin
  EnumThreadWindows(ThreadId, @EnumThreadWndProc, Integer(ListBox.Items));
end;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6
  Alt 26. Jul 2002, 23:09
Tut mir leid, dass ich noch weiter frage, aber was bedeutet
Code:
Integer(ListBox.Items)
?
Ich versteh das mit dem
Zitat:
application-defined value
nicht.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 27. Jul 2002, 00:11
"application-defined value" bedeutet, dass du damit machen kannst was du willst, sollange es 4 Bytes nicht überschreitet (32Bit Integer). Mit Integer(ListBox.Item) übergebe ich die ListBox.Items: TStrings als Integer. Da ListBox.Items ein Zeiger auf eine TStringList-Instanz ist, und Zeiger 4 Bytes groß sind, konvertiere (typecast) ich diesen Zeiger in einen 32Bit Integer, den ich als "application-defined value" übergebe. Dieser Wert wird dann an die Callback-Funktion (EnumThreadWndProc) als zweiter Parameter übergeben.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8
  Alt 27. Jul 2002, 18:05
Hmm, ich glaube, ich hab oben was Falsches gesagt. Ich glaub, ich habe die ThreadID doch nicht. Ich schreib mal auf, wie ich denk, wie man die ThreadID über den Namen und Pfad der ausführbaren Datei kommt.

1. Erstellung eines System-Snaphshots mit CreateToolhelp32Snapshot

2. Ermittlung der ProcessID aller Prozesse über Process32First und Process32Next mit dem angegebenen Dateinamen.

3. Ausführen von Module32First und Module32Next. Vergleich jeder ProcessID mit der Liste der ProcessIDs von 2. Wenn ID übereinstimmt, heißt das, der Name des ausgeführten Programms ist gleich. Dann mit Hilfe von szExePath die endgültig gesuchte ProcessID herausfinden.

4. Ausführen von Thread32First und Thread32Next. Sichern aller ThreadIDs, die als th32OwnerProcessID die ProcessID von 3 haben. Somit hat man die ThreadIDs aller Threads des gewünschten Prozesses.

5. Mit EnumThreadWindows die Fenster aller Threads durchgehen, solange, bis das Hauptformular gefunden wurde.
Problem: Wie kann man dieses erkennen?

6. Nun hat man das Fensterhandle und kann mit diesem machen, was man will


Ist nur ein reichlich komplizierter (zumindest für nen WinAPI-Anfänger) Weg. Gibts einen einfacheren Weg?
Eine Verkürzung wäre, wenn man den Hauptthread herausfinden könnte. Dann müsste man bei 5 nur einmal das EnumThreadWindow-Gedingsel durchgehen. Dazu wichtig die Frage: In einem Prozess mit mehreren Threads, ist das Hauptfenster überhaupt immer in dem Hauptthread? Bzw. gibt es eigentlich einen Hauptthread und davon abgeleitete Threads oder kann es mehrere "Hauptthreads" geben?

Fragen über Fragen, wäre schön, wenn mir jemand darauf Korrekturen, Tips oder was auch immer geben könnte.
Nur mal so nebenbei: Die theoretische Vorgehensweise hab ich mit Hilfe des Windows SDK und den Antworten hier von jbg entwickelt und das ist die beste Lernmethode. Das in Code umzusetzen ist zweitrangig.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9
  Alt 27. Jul 2002, 18:44
Es gibt noch einen anderen Weg. Nämlich andersherum vorgehen.
Du ermittelst mit EnumWindows() alle Hauptfenster und kannst dann mit Hilfe der API GetWindowModuleFileName (erst ab Win98) den Dateinamen der Anwendung sowie mit der API GetWindowThreadProcessId das Process Handle herausfinden.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10
  Alt 27. Jul 2002, 22:07
OK, werd ich mal versuchen. Aber würde der von mir beschriebene Weg funktionieren?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:09 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