Autor |
Beitrag |
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Do 18.12.08 17:34
Joa und nu...den ProzessHandle konnte ich auch damit ermitteln
Delphi-Quelltext 1: 2:
| processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION, False, hprocessID); |
Ich brauche ja immernoch das TOP Fenster.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 18.12.08 17:40
Was soll das TOP-Fenster sein?
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Do 18.12.08 17:43
Das erste Fenster was in der Anwendung aufgerufen wird auch das TOP Level genannt.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 18.12.08 17:46
Und wodurch zeichnet sich das aus? Ein Flag TOP_WINDOW oder so wäre mir neu.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Do 18.12.08 17:50
Deshalb auch meine Frage ob es nicht eine Kennzeichnung gibt woran man es festmachen könnte.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 18.12.08 17:52
Zumindest mir ist keine bekannt.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Do 18.12.08 18:05
Schade, ich wüsste jetzt nicht wie ich das jetzet realisieren könnte.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 19.12.08 10:37
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 19.12.08 10:58
Wo liegt denn jetzt noch Dein Problem?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 19.12.08 11:06
Das sind aber kurze 24 Stunden, pushen ist erst dann erlaubt.
Es gibt nun einmal kaum eine andere gute Möglichkeit als alle Prozesse durchzugehen...
Den Link hast du gesehen...
Du kannst es mit Win32_Process via WMI versuchen, da gibt es ParentProcessId, ich vermute damit macht es auch der ProcessExplorer:
msdn.microsoft.com/e...aa394372(VS.85).aspx
Aber ob das eine so gute Lösung für diesen Zweck ist bin ich mir nicht so sicher. Da bekommst du jedenfalls, wenn das klappt, die ProcessId, und kannst dann die Fenster des Prozesses durchgehen.
Hast du eins gefunden kannst du GetAncestor mit GA_ROOT versuchen um das oberste Parent Window zu finden.
Die schlechteste Lösung wäre, deine Botschaft an alle Fenster, die du mit EnumWindows bekommst zu schicken. Darunter wird auch das deiner Anwendung sein.
Naja, aber da du deine Software ja wohl kaum weitergeben willst (dann würdest du es ja hoffentlich sauber programmieren), kannst du ja auch das machen... Solange du das nicht bei Software machst, die du veröffentlichen willst.
DerNetteNachbar hat folgendes geschrieben : | Schade, ich wüsste jetzt nicht wie ich das jetzet realisieren könnte. |
Normal 
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 19.12.08 11:06
Naja das Problem ist immer noch das ich die falsche ProzessID bekomme wenn ich in meiner DLL
Delphi-Quelltext 1: 2:
| GetCurrentProcess() oder GetWindowThreadProcessID |
aufrufe, nämlich die der DLL. Ich möchte aber die ProzessID vom Elternprozess in dem Fall der aufrufende EXE Datei erhalten umso dann auf das MainWindow zu kommen.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 19.12.08 11:12
GetModuleHandle(nil) sollte laut MSDN das Richtige sein, hat jaenicke doch bereits gepostet.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 19.12.08 11:16
DerNetteNachbar hat folgendes geschrieben : | Da ich aber fest entschlossen bin es auf die Art(API Funktionen) zu machen um mich auch in die API Welt einzuarbeiten |
Die einzige sinnvolle Möglichkeit dafür ist selbst in der API Referenz zu suchen, nur dadurch lernst du diese kennen. Und genau das ist das wichtige. Ich kenne nicht alle Funktionen auswendig, ich weiß aber wie ich in der Referenz etwas finde.
Und das lernst du nicht, wenn du um Funktionen zu finden jedesmal nachfragst. 
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 19.12.08 11:25
GetModuleHandle(nil) klappt nicht wirklich, denn es liefert mir ein unbekanntes Handle, das habe ich aber auch schon mal gepostet.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 19.12.08 11:39
DerNetteNachbar hat folgendes geschrieben : | GetModuleHandle(nil) klappt nicht wirklich, denn es liefert mir ein unbekanntes Handle, das habe ich aber auch schon mal gepostet. |
Das kann ich nicht reproduzieren. Ich habe es gerade getestet, bei mir ist das Handle gültig.
Zum Test habe ich GetModuleFileName darauf angewendet, es liefert mir Pfad und Dateiname der Exe, nicht der DLL, also wie es sein soll. Es ist also ein gültiger HInstance Wert. Wie es in der Doku auch steht.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 19.12.08 11:56
Das ist korrekt ich kriege den Pfad zu den EXE Dateien, allerdings liefert mir diese Funktion zweimal den gleichen Handle Wert. Sprich ich rufe die DLL aus zwei verschiedenen EXE Dateien auf und mir wird immer ein und dasselbe Handle zurückgeliefert. Komischer Verlauf. Ich will aber genau diesen Wert eindeutig haben um diesen im nachhinein zu vergleichen und die Anwendung zu identifizieren.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 19.12.08 12:04
Also ich habe gerade einen kleinen Test gemacht: DLL 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function EnumWindowsProc(Hnd: HWND; lParam: LPARAM): Boolean; stdcall; begin Result := GetWindowLong(Hnd, GWL_HINSTANCE) <> GetModuleHandle(nil); if not Result then SendMessage(GetAncestor(Hnd, GA_ROOT), WM_USER + 100, 0, 1);
Result := True; end;
begin EnumWindows(@EnumWindowsProc, 0); end; | Programm 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm99.Button1Click(Sender: TObject); begin FreeLibrary(LoadLibrary('Project100.dll')); end;
procedure TForm99.WndProc(var Msg: TMessage); begin if Msg.Msg = WM_TEST then ShowMessage(IntToStr(Msg.LParam)) else inherited; end; | Jetzt habe ich das Programm mehrfach gestartet, und die MessageBox kam immer genau in dem Programm, das die DLL aufgerufen hat, genau wie es sein soll...
Und durch die Zeile Result := True; werden ja explizit alle Fenster durchgegangen.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 20.12.08 17:03
Also hier werden alle möglichen Dinge vermischt..!
Prozess-Handle != Prozess-ID != Fenster-Handle != Module-Handle
- Die Prozess-Id ist eine eindeutige Nummer die von Windows an die einzelnen Prozesse vergeben wird - diese erscheint auch im Taskmanager (PID).
- Ein Prozess-Handle erhält man über OpenProcess. Es handelt sich hierbei um einen Index einer internen Tabelle mit allen Kernel-Objekten des Prozesses. Ein solches Handle ist also immer nur innerhalb des eigenen Prozesses gültig!
- Ein Fenster-Handle ist eine von Windows vergebene eindeutige Nummer für ein Fenster.
- Ein Module-Handle ist eigentlich nichts anderes als die Basisadresse des Moduls im entsprechenden Prozessraum.
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 20.12.08 17:41
|
|