AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FindWindowEx Logik

Ein Thema von toms · begonnen am 12. Nov 2004 · letzter Beitrag vom 13. Nov 2004
Antwort Antwort
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#1

FindWindowEx Logik

  Alt 12. Nov 2004, 18:46
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!
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#2

Re: FindWindowEx Logik

  Alt 12. Nov 2004, 22:21
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;
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

Re: FindWindowEx Logik

  Alt 12. Nov 2004, 23:46
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"
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

FindWindowEx Problem (2)

  Alt 13. Nov 2004, 07:33
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"
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: FindWindowEx Logik

  Alt 13. Nov 2004, 13:38
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
   );
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:07 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