Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Frage zu FindWindow (https://www.delphipraxis.net/77965-frage-zu-findwindow.html)

Marco1974 28. Sep 2006 08:00

Re: Frage zu FindWindow
 
Hallo Ihr,

denke mal, dass ich das Problem genau so angehen werde. Also nur die sichtbaren Fenster nach Titeln überprüfen und dann gucken, ob mein gewünschtes dabei ist.

Danke auf jeden Fall für die ganzen Anregungen!!!

Viele Grüße

Marco

Ajin 9. Okt 2006 13:31

Re: Frage zu FindWindow
 
Ich würde das Thema gerne wieder aufgreifen.

Eine Anwendung bringt einen Text in einem Wordpad Fenster hoch. Ich brauche das handle von diesem Wordpad Fenster - leider kann ich das handle nicht so einfach über den Fensternamen bekommen, da es sich von Fall zu Fall verändert.

Allerdings steht am Ende des Fenstertitels immer "WordPad"

Kann ich da nicht irgendwie tricksen mit CompareText?

Kann ich bei FindWindow('Tralala34 - WordPad') statt dem String eine Funktion hinterlegen welche auf einen Teilstring prüft?

Christian Seehase 9. Okt 2006 16:40

Re: Frage zu FindWindow
 
Moin Jaimy,

Zitat:

Zitat von Christian Seehase
Die Stichworte/Suchbegriffe, die mir zur Problemlösung einfallen:
EnumWindows, IsWindowVisible, SendMessage/WM_GETTEXT/WM_GETTEXTLENTH, pos, AnsiUpperCase oder AnsiLowerCase.

Soll heissen:
Alle Top-Level-Fenster durchgehen, dabei die sichbaren herausfiltern, die Caption holen und prüfen, ob der Fenstertitel mit dem gewünschten String anfängt.


Ajin 27. Okt 2006 13:47

Re: Frage zu FindWindow
 
Ich habs gelöst. Es gibt da einen tollen download diesbezüglich: ri-soft.de

Da gibts ein Tool mit dem kann ich den Klassennahmen herausfinden kann - damit geht das prima!

Grüsse´!"

Christian Seehase 27. Okt 2006 13:57

Re: Frage zu FindWindow
 
Moin Jaimy,

Zitat:

Zitat von Ajin
Da gibts ein Tool mit dem kann ich den Klassennahmen herausfinden kann

was Du mit EnumWindows und GetClassName auch recht einfach nachbauen könntest. ;-)

Wie eindeutig ist denn der Klassennamen?

SirThornberry 27. Okt 2006 14:12

Re: Frage zu FindWindow
 
Es gibt auch die Möglichkeit bei FindWindow für beide Paramter "nil" zu übergeben und dann mit GetWindow und GW_HWNDNEXT alle Fenster der Ebene durchzugehen.

Vjay 27. Okt 2006 14:25

Re: Frage zu FindWindow
 
Ich hab vor einiger Zeit mal soetwas gebaut, man kann auch jeweils NIL übergeben.

Die Funktion braucht noch einige Hilfsfunktionen, ich packe sie mal mit rein, hoffe das wird nicht zu unübersichtlich und ich vergesse nichts.
Die Funktion hat so wie sie da steht den Vorteil, dass sie nicht blockiert, sobald sie auf eine blockierende Anwendung trifft.

Delphi-Quellcode:

{** HandleListe aller Fenster}
function getWindowList: TList;
type
 pList= ^TList;
 function enumWindowsProc (hWnd: integer; bla: pointer): BOOL; stdcall;
 begin
  pList(bla)^.Add( pointer( hWnd));
  result:= true;
 end;
begin
 result:= TList.create;
 Result.Capacity := 40;
 enumWindows( @enumWindowsProc, integer(@result));
 Result.Capacity := Result.count;
end;

{** Gibt die Caption eines Fensters zurück.}
function vGetWindowTextTimeOut(const h:integer; const timeOut: integer):string;
var
 dw: dword;
begin
 setLength(result, 256);
 sendMessageTimeOut(h, WM_GETTEXT, 256, integer(pchar(result)), SMTO_ABORTIFHUNG, timeOut, dw);
 setLength(result, strlen( pchar( result)));
end;

{** Gibt den Klassennamen eines Fensters zurück.}
function vGetClassName(const h:integer):string;
begin
 setLength(result, 100);
 getClassName(h, pchar(result), 100);
 setLength(result, strlen( pchar( result)));
end;

function vFindWindow(const Klasse, Name: pchar; const usePos, mustBeVisible: Boolean): integer;
var
 handle, wdh: integer;
 WindowList: TList;
begin

 result:= 0;
 WindowList:= getWindowList;
 if not usePos then
 begin
  for wdh:= 0 to WindowList.count -1 do
  begin
   handle:= integer( WindowList[ wdh]);
   if ((Klasse=NIL) or (vgetClassName( handle) = Klasse)) and ((Name= NIL) or (vGetWindowTextTimeOut( handle, 250) = Name)) then
   begin
    if not mustBeVisible or isWindowVisible(handle) then
    begin
     result:= handle;
     break;
    end;
   end;
  end;
 end
 else
 begin
  for wdh:= 0 to WindowList.count -1 do
  begin
   handle:= integer( WindowList[ wdh]);

   if ((Klasse=NIL) or (pos(Klasse, vgetClassName( handle))>0)) and ((Name=NIL) or (pos(Name, vGetWindowTextTimeout( handle, 250))>0)) then
   begin
    if not mustBeVisible or isWindowVisible(handle) then
    begin
     result:= handle;
     break;
    end;
   end;
  end;
 end;
 WindowList.free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.
Seite 2 von 2     12   

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