Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Eigenes Handle finden (https://www.delphipraxis.net/141221-eigenes-handle-finden.html)

Schwedenbitter 5. Okt 2009 10:10


Eigenes Handle finden
 
Hallo,

ich habe folgendes Problem:
Ich habe eine Anwendung nonVCL geschrieben. Nun benötige ich u.a. für den Aufruf von GetWindow(); das Handle meines eigenen Programms. Wenn ich VCL benutze, dann nehme ich dort entweder Application.Handle oder abgeleitet vom Haupt-Formular self.Handle. Das geht hier leider nicht.

Wie komme ich möglichst ohne großen Aufwand an mein Handle ran?

Gruß, Alex

P.S. Auch wenn die Lösung einfach sein sollte und schon 100fach im Forum steht, bitte nicht meckern. Ich habe schon mehrmals die Suche benutzt, aber nichts gefunden. U.U. liegt es auch an falschen/fehlenden Suchbegriffen.

Fridolin Walther 5. Okt 2009 10:18

Re: Eigenes Handle finden
 
Wenn Du via MSDN-Library durchsuchenGetWindow das Handle eines Deiner eigenen Fenster ermitteln möchtest, solltest Du das Fensterhandle ja haben (immerhin wurde es bei der Fenstererstellung ja zurückgeliefert und Du hast es hoffentlich gespeichert).

Schwedenbitter 5. Okt 2009 13:00

Re: Eigenes Handle finden
 
Zitat:

Zitat von Fridolin Walther
Wenn Du via MSDN-Library durchsuchenGetWindow das Handle eines Deiner eigenen Fenster ermitteln möchtest, solltest Du das Fensterhandle ja haben (immerhin wurde es bei der Fenstererstellung ja zurückgeliefert und Du hast es hoffentlich gespeichert).

Ich kann damit nichts anfangen. Kannst Du das bitte genauer erläutern? Wenn ich mein Fensterhandle hätte, müsste ich das nicht mit GetWindow erst suchen.
Entschuldigung: Evtl. habe ich mich auch nicht vollständig/richtig ausgdrückt. Meine Anwendung hat kein(e) Fenster. Sie läuft einem Dienst ähnlich ohne Benutzerinteraktion im Hintergrund. Dabei ist es notwending, dass ich auf das Ende eines bestimmten Programms/Fensters warte (vgl. diesen Thread). Um das zu prüfen, wollte ich mit GetWindow alle Fenster so durchsuchen:
Delphi-Quellcode:
function FindWindowByTitle(WindowTitle: string): Hwnd;
var
  NextHandle: Hwnd;
  NextTitle: array[0..255] of char;
begin
  // Get the first window
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin
    // retrieve its text
    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else
      // Get the next window
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;
Mit Einbindung der VCL klappt das wunderbar. Nur wie mache ich das ohne ein Fenster? Mit GetWindow(0, GW_HWNDFIRST); klappt es jedenfalls nicht.

Gruß, Alex

Luckie 5. Okt 2009 13:11

Re: Eigenes Handle finden
 
Warum so kompliziert. lass Windows doch die Arbeit für dich machen: MSDN-Library durchsuchenFindWindow.

Schwedenbitter 5. Okt 2009 13:25

Re: Eigenes Handle finden
 
Zitat:

Zitat von Luckie
Warum so kompliziert.

Weil ich leider nicht den vollständigen Namen kenne. Die Funktion oben liefert mir aber nur ein Ergebnis, wenn ich genau diesen vollständigen Namen angeben kann. Sollte ich mich irren, wäre die Function ja in der Tat wenig sinnvoll.

Das bringt mich zu einem weiteren Problem: Mit der Function findet man ja allerhand Fenster, auch solche die nicht sichbar sind. Gibt es eine Möglichkeit gerade in MDI-Programmen auch die anderen Fenster im Programm selbst zu finden? Wenn ich z.B. Im FireFox mehrere Fenster geöffnet habe, dann zeigt er mir immer nur den Titel des aktuell angezeigten Fensters an.
Dass es grundsätzlich möglich sein muss, sehe ich an WinSpy.

Gruß, Alex

Schwedenbitter 5. Okt 2009 15:18

Re: Eigenes Handle finden
 
Bei Torry's Delphi Page habe ich das hier gefunden:
Delphi-Quellcode:
function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
var
  Title, ClassName: array[0..255] of char;
begin
  Result := True;
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) then
     lb.Items.Add(string(Title) + '-' + string(ClassName));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumWindowsProc, Integer(Listbox1));
end;
Hier wird als HWND einfach ein Zeiger auf die Function selbst verwandt. Ich habe das in meiner o.g. Procedure probiert. Es sah auf den ersten Blick ganz verlocken aus. Aber ich hatte schon vermutet, dass es nicht gehen würde, denn Handle <> Pointer. Oder kann man das wider Erwarten zum Laufen bringen mit einem Compilter-Schalter?

Weiter unten auf derselben Seite steht dann die Function GetCurrentThreadID auch im Zusammenhang mit HWND. Ich habe das probiert. Macnhmal kommen ein paar Fenstername (aber nicht alle)...

Gruß, Alex

turboPASCAL 5. Okt 2009 15:23

Re: Eigenes Handle finden
 
Zitat:

ch habe eine Anwendung nonVCL geschrieben. Nun benötige ich u.a. für den Aufruf von GetWindow(); das Handle meines eigenen Programms.
Wenn das Ding dein Programm ist hat du duch schon das Handle deines Fensters.
Ist jetzt die Frage, wie erstellts du das Fenster ?

Schwedenbitter 5. Okt 2009 15:49

Re: Eigenes Handle finden
 
Zitat:

Zitat von turboPASCAL
Wenn das Ding dein Programm ist hat du duch schon das Handle deines Fensters.
Ist jetzt die Frage, wie erstellts du das Fenster ?

Wahrscheinlich habe ich jetzt Tomaten auf den Augen.
Ich habe kein Fenster und ich erstelle auch keins. Deshalb kenne ich nicht "... das Handle deines Fensters." Wenn dem so wäre, gäbe es das Problem ja nicht.

Ich habe eine Anwendung ohne die VCL und ohne jedes Fenster. Ich möchte nur die Namen der vorhandenen Fenster mit der unter #3 genannten Function für die interne Weiterverarbeitung finden. Innerhalb dieser Function findet sich der Aufruf
Delphi-Quellcode:
NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
wieder, der eben ein Handle voraussetzt. Da ich weder ein TForm noch ein TApplication habe, kann ich self.Handle bzw. Application.Handle nicht als Parameter mitgeben. Ich weiß nicht, wie ich mein Problem noch schildern soll.

Was gebe ich ohne Fenster als hwnd mit? bzw.
Was gibt es für Alternativen für die Funktion?

Gruß, Alex

Luckie 5. Okt 2009 15:55

Re: Eigenes Handle finden
 
MSDN-Library durchsuchenEnumWindows.

Sherlock 5. Okt 2009 15:57

Re: Eigenes Handle finden
 
Wenn Du kein Handle hast, dann kannst Du auch keines übergeben, versuchs an der Stelle mal mit nil oder so.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr.
Seite 1 von 2  1 2      

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