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 Problem mit FindWindowEx - Klasse #32770 macht Probleme (https://www.delphipraxis.net/35035-problem-mit-findwindowex-klasse-32770-macht-probleme.html)

Totti 1. Dez 2004 17:53


Problem mit FindWindowEx - Klasse #32770 macht Probleme
 
Zuersteinmal Hallo - mein erster Post ;)

Ich möchte:
1. Programm starten
2. einen (Default-)Button Klick simulieren
3. warten, bis das Programm idlet
4. eine aufploppende MsgBox (Infobox, nur OK-Button) beenden
5. Programm beenden

1 krieg ich hin. Für 2 nutze ich PostMegssage mit vk_return. bei 3 versuch ich es mit "WaitForInputIdl".
Und 5 würde ich wieder mit Postmessage (tab und dann return) regeln.

Doch richtig, nur würde ... denn 4 bereitet mir arge Probleme.
Ich krieg es auf biegen und brechen nicht hin, das handle dieses buttons der Infobox zu bekommen :(
Ich kriege das Handle der Infobox einfach nicht heraus. Gebe ich dessen Handle an, krieg ich mit FindWindowEx wunderbar das handle des Buttons und kann ihn auch betätigen. Doch irgendwie scheint die Klasse der Box ('#32770') ein Problem dar zu stellen.

Code:
wnd := FindWindowEx(wnd,0,'#32770','fat GUI');
Damit hab ich es versucht - jedoch ohne Erfolg.

Code:
wnd := FindWindowEx(handle,0,'Button','OK');
Wenn ich das entsprechende Handle der Box direkt angebe, findet er mit dieser Zeile den Button.

Wäre über Hilfe dankbar ;)

Gruß
Malte

Luckie 1. Dez 2004 17:58

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
 
Willst du damit:
Delphi-Quellcode:
wnd := FindWindowEx(wnd,0,'#32770','fat GUI');
Ds Handle der Messagebox bekommen? MSDN-Library durchsuchenFindWindowEx ist dazu geadcht Handles von Kindfesntern zu erhalten. Mit MSDN-Library durchsuchenFindWindow solltest du das Handle der Messagebox bekommen.

Motzi 1. Dez 2004 18:19

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
 
Man kann bei FindWindowEx aber auch einfach 0 als Handle für das Parent-Fenster angeben, dann verhält sich FindWindowEx genauso wie FindWindow.. falls du trotzdem noch Probleme haben solltest probiers mal mit der Ersatz-Funktion die ich mir gebastelt hab - FindWindow(Ex) ermitteln den Window-Text nämlich per GetWindowText und das kann Probleme geben.. (siehe PSDK)

Delphi-Quellcode:
function XSpy_FindWindowEx(WndParent: HWND; WndChildAfter: HWND;
  lpszClass: PChar; lpszWindow: PChar): HWND;

type
  TEnumWndRec = record
    lpszClass: PChar;
    lpszWindow: PChar;
    Wnd: HWND;
    WndParent: HWND;
    WndChildAfter: HWND;
    bChildFound: Boolean;
  end;

var
  aEnumWndRec: TEnumWndRec;

  function GetClassName(Wnd: HWND): String;
  var
    szBuffer: array [0..255] of Char;
  begin
    ZeroMemory(@szBuffer, SizeOf(szBuffer));
    Windows.GetClassName(Wnd, szBuffer, SizeOf(szBuffer));
    Result := String(szBuffer);
  end;

  function GetWindowText(Wnd: HWND): String;
  var
    dwResult: DWord;
    pBuffer: PChar;
  begin
    dwResult := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0) + 1;
    pBuffer := GetMemory(dwResult);
    try
      SendMessage(Wnd, WM_GETTEXT, dwResult, Integer(pBuffer));
      Result := String(pBuffer);
    finally
      FreeMemory(pBuffer);
    end;
  end;

  function EnumCallBack(Window: HWND; var aRec: TEnumWndRec): Boolean; stdcall;
  var
    bMatches: Boolean;
  begin
    Result := True;

    if (aRec.WndParent <> 0) and
      (aRec.WndParent <> GetAncestor(Window, GA_PARENT)) then
      Exit;
     
    if (aRec.WndChildAfter <> 0) and not aRec.bChildFound then
    begin
      aRec.bChildFound := aRec.WndChildAfter = Window;
      Exit;
    end;

    bMatches := True;
    if Assigned(aRec.lpszClass) then
      bMatches := String(aRec.lpszClass) = GetClassName(Window);

    if bMatches and Assigned(aRec.lpszWindow) then
      bMatches := String(aRec.lpszWindow) = GetWindowText(Window);

    if bMatches then
    begin
      aRec.Wnd := Window;
      Result := False;
    end;
  end;

begin
  Result := 0;
  if (WndParent <> 0) and not IsWindow(WndParent) then
    Exit;

  aEnumWndRec.lpszClass := lpszClass;
  aEnumWndRec.lpszWindow := lpszWindow;
  aEnumWndRec.Wnd := 0;
  aEnumWndRec.WndParent := WndParent;
  aEnumWndRec.WndChildAfter := WndChildAfter;
  aEnumWndRec.bChildFound := False;
  if WndParent = 0 then
    EnumWindows(@EnumCallBack, Integer(@aEnumWndRec))
  else
    EnumChildWindows(WndParent, @EnumCallBack, Integer(@aEnumWndRec));

  Result := aEnumWndRec.Wnd;
end;

Totti 1. Dez 2004 18:27

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
 
crazy ... japs - cool :D

Da fragt man sich den ganzen tag durch ... und landet am Ende des Abends dann hier so schnell bei der Lösung.
Hätte ich auch mal vorher probieren können :( edenfalls kenn ich nun die Parameter der FindWindowEx auswednig ;)
:hello: :hello:


Das nächste Problem aber ist nun, dass ich den Button irgendwie netmehr bestätigt bekomme :(
Hab es mit Postmessage und Sendmessage und mit bm_click sowie keydown mit vk_return probiert.

Wie komm ich hier weiter?


edit:
Danke Motzi, hab deinen beitrag aber erst nach meinem gelesen.
Hab jedoch mittels WinSpy die handles verglichen und da hat er schon die korrekten gefunden.

Luckie 1. Dez 2004 18:29

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
 
Findest du auch das richtige Fenster? Alle Dialoge die mit dem Ressourcen-Editor vom VS gemacht wurden, haben standardmäßig die Klasse #32770.

Totti 1. Dez 2004 18:32

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
 
grml, wieder zu spät, hehe

Ja, hab ich mit WinSpy verglichen und die handles die mein programm auswirft sind mit den dort angezeigten identisch.
Ich suche ja nach Klasse und Titel.

edit:
hmm, der machts bei exakt jedem 2. Versuch¿?
die ahndles sind bei beiden versuchen die gleichen?!?

Also, wenn ich
Code:
postMessage(wnd,bm_click,0,0);
postMessage(wnd,bm_click,0,0);
ausführe (also 2x nacheinander) klappts, sonst wird der button irgendwie erst einmal dick und erst danach klappts.
Muss sich da noch nen Focus setzen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 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