AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Eigenes Handle finden

Ein Thema von Schwedenbitter · begonnen am 5. Okt 2009 · letzter Beitrag vom 6. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2   
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Eigenes Handle finden

  Alt 5. Okt 2009, 11:10
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.
Alex Winzer
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 11:18
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).
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 14:00
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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 14:11
Warum so kompliziert. lass Windows doch die Arbeit für dich machen: MSDN-Library durchsuchenFindWindow.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 14:25
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
Alex Winzer
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 16:18
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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#7

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 16:23
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 ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 16:49
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 AufrufNextHandle := 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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 16:55
MSDN-Library durchsuchenEnumWindows.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.753 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Eigenes Handle finden

  Alt 5. Okt 2009, 16:57
Wenn Du kein Handle hast, dann kannst Du auch keines übergeben, versuchs an der Stelle mal mit nil oder so.

Sherlock
Oliver
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:18 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