Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FindWindowEx Logik (https://www.delphipraxis.net/33796-findwindowex-logik.html)

toms 12. Nov 2004 19:46


FindWindowEx Logik
 
Hey!

Habe ein kleines Problem mit der FindWindowEx() Funktion.
Ich ermittle von einem ChildControl das Parent Handle mittels GetParent
und suche dann später das ChildControl anhand der FindWindowEx() wieder.

Aber: Er findet es nicht! FindWindowEx() gibt immer null zurück! Warum?

Evtl mache ich einen Logik Fehler.


Delphi-Quellcode:
var
 p1, p2: PChar;
 wndChild,
 wndParent : HWND;
Delphi-Quellcode:
  wndChild := ... // ein gültiges Handle zuweisen

  // Parent von wndChild ermitteln
  wndParent := GetParent(wndChild);
 
  p1 := PChar(_GetClassName(wndChild)); // _GetClassName() liefert den KlassenNamen von einem Handle
  p2 := PChar(_GetWinText(wndChild)); // _GetWinText() liefert den Text von einem Handle

  // das ChildControl suchen
  wndChild := FindWindowEx(wndParent, 0, p1, p2); // <--- gibt immer 0 zurück!

Sprint 12. Nov 2004 23:21

Re: FindWindowEx Logik
 
Zitat:

Zitat von toms
Aber: Er findet es nicht! FindWindowEx() gibt immer null zurück! Warum?

Mit halben Source Code von dir, ist es schwer zu ermitteln was falsch läuft. Kann dir aber versichern das FindWindowEx funktioniert.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  WndParent: HWND;
  WndChild: HWND;
  ClsNameChild: String;
  TitleChild: String;
begin

  WndChild := Button1.Handle;
  WndParent := Windows.GetParent(WndChild);
  SetLength(ClsNameChild, 1024);
  SetLength(ClsNameChild, GetClassName(WndChild, PChar(ClsNameChild), Length(ClsNameChild)));
  SetLength(TitleChild, 1024);
  SetLength(TitleChild, GetWindowText(WndChild, PChar(TitleChild), Length(TitleChild)));
  WndChild := FindWindowEx(WndParent, 0, PChar(ClsNameChild), PChar(TitleChild));
  if WndChild = 0 then
    RaiseLastOSError;

end;

toms 13. Nov 2004 00:46

Re: FindWindowEx Logik
 
Hi Sprint,

Danke für deine Antwort!

Aber leider hilft mir dein Code auch nicht weiter. Zudem kann GetWindowText nur den Text von Fenster-Captions
zurückgeben und nicht Controls. (siehe msdn)

Ich poste mal einen allgemeinen Code zu meinem Problem:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
 var
  wnd: HWND;
begin
  wnd := FindWindow('TAppBuilder', nil); // wnd ist <> 0, alles ok bis jetzt
  wnd := FindWindowEx(wnd, 0, 'TControlBar', nil); // wnd ist <> 0, alles ok bis jetzt
  wnd := FindWindowEx(wnd, 0, 'TDockToolBar', 'Standard'); // wnd ist immer null, obwohl das Child 'TDockToolBar' existiert!
  if wnd <> 0 then
  begin
      ShowMessage('gefunden');
  end;
end;

Fensterstruktur:

Code:
Klassen Name: "TAppBuilder" | Title: "Delphi 6 - Project1" | Handle: 1966888
  1573686: TControlBar
    2097588: TDockToolBar "Menu bar"
    655736: TDockPanel "Component Palette"
      721300: TComponentPaletteTabControl
        590250: TPanel
        590446: TPageScroller
          655758: TPalette "Palette"
    1769832: TDockToolBar "Custom"
    655980: TDockToolBar "Desktop"
      1245788: TDesktopComboBox "<None>"
        917904: Edit "<None>"
    1049424: TDockToolBar "Debug"
    852428: TDockToolBar "View"
    655802: TDockToolBar "Standard"

toms 13. Nov 2004 08:33

FindWindowEx Problem (2)
 
Hi,

Habe 3 Codes und alle sollten das gleiche machen, nur tun sie das nicht!
Code1 funktioniert, aber Code2, Code3 nicht.

Was mache ich da falsch?


Code1: ShowMessage('Gefunden'); wird angezeigt.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  wndApp, wndControlBar, wnd: HWND;
begin
  wndApp := FindWindow('TAppBuilder', nil);
  wndControlBar := FindWindowEx(wndApp, 0, 'TControlBar', nil);

  // wndControlBar ist immer <> 0

  wnd := FindWindowEx(wndControlBar, 0, 'TDockToolBar', nil);
  wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil);
  wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil);
  wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil);
  wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil);
  wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil);
 
  // wnd ist immer <> 0
 
  if wnd <> 0 then
  begin
    ShowMessage('Gefunden'); // Klasse von wnd : TDockToolBar, Text von wnd : Standard
  end;
end;

Code2: ShowMessage('Gefunden'); wird nie angezeigt.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  wndApp, wndControlBar, wnd: HWND;
begin
  wndApp := FindWindow('TAppBuilder', nil);
  wndControlBar := FindWindowEx(wndApp, 0, 'TControlBar', nil);

  wnd := FindWindowEx(wndControlBar, 0, 'TDockToolBar', 'Standard'); // wnd wird immer 0!
  if wnd <> 0 then
  begin
    ShowMessage('Gefunden'); // Class: TDockToolBar, Text: Standard
  end;
end;
Code3: ShowMessage('Gefunden'); wird nie angezeigt.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  wndApp, wndControlBar, wnd: HWND;
begin
  wndApp := FindWindow('TAppBuilder', nil);
  wndControlBar := FindWindowEx(wndApp, 0, 'TControlBar', nil);

  wnd := FindWindowEx(wndControlBar, 0, nil, 'Standard'); // wnd wird immer 0!

  if wnd <> 0 then
  begin
    ShowMessage('Gefunden'); // Class: TDockToolBar, Text: Standard
  end;
end;

FensterStruktur:

Code:
Klassen Name: "TAppBuilder" | Title: "" | Handle: 1966888 
  1573686: TControlBar
    2097588: TDockToolBar "Menu bar"
    655736: TDockPanel "Component Palette"
      721300: TComponentPaletteTabControl
        590250: TPanel
        590446: TPageScroller
          655758: TPalette "Palette"
    1769832: TDockToolBar "Custom"
    655980: TDockToolBar "Desktop"
      1245788: TDesktopComboBox "<None>"
        917904: Edit "<None>"
    1049424: TDockToolBar "Debug"
    852428: TDockToolBar "View"
    655802: TDockToolBar "Standard"

toms 13. Nov 2004 14:38

Re: FindWindowEx Logik
 
Habe diese Antwort in der Delphi Newsgroup erhalten:

Zitat:

<quote
source="ms-help://MS.MSDNQTR.2004JAN.1033/winui/winui/windowsuserinterface/wind
owing/windows/windowreference/windowfunctions/findwindowex.htm">
If the lpszWindow parameter is not NULL, FindWindowEx calls the GetWindowText
function to retrieve the window name for comparison. For a description of a
potential problem that can arise, see the Remarks section of GetWindowText.
</quote>

The remarks section for GetWindowText is, however, somewhat misleading. The
naked truth is that GetWindowText cannot retrieve the caption of a window in
another process reliably because it is *not* using WM_GETTEXT in that case. And
that is what would have to be done to match on the caption in your FindWindowEx
call.
Fazit: Bei der FindWindowEx() Funktion lpszWindow nil übergeben, wenn sie
Childfenster in einem anderen Prozess sucht.

Grund: FindWindowEx vergleicht bei Angabge von lpszWindow die Übereinstimmung des FensterNamens (lpszWindow) mittels GetWindowText, welche aber nicht zuverlässig ChildFenster Text in einem anderen Prozess ermitteln kann.


Delphi-Quellcode:
HWND FindWindowEx(

    HWND hwndParent,   // handle to parent window
    HWND hwndChildAfter,   // handle to a child window
    LPCTSTR lpszClass,   // pointer to class name
    LPCTSTR lpszWindow   // pointer to window name
   );


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr.

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 by Thomas Breitkreuz