AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit FindWindowEx - Klasse #32770 macht Probleme
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit FindWindowEx - Klasse #32770 macht Probleme

Ein Thema von Totti · begonnen am 1. Dez 2004 · letzter Beitrag vom 1. Dez 2004
Antwort Antwort
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#1

Problem mit FindWindowEx - Klasse #32770 macht Probleme

  Alt 1. Dez 2004, 17:53
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
Malte
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme

  Alt 1. Dez 2004, 17:58
Willst du damit:
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme

  Alt 1. Dez 2004, 18:19
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;
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme

  Alt 1. Dez 2004, 18:27
crazy ... japs - cool

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



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.
Malte
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme

  Alt 1. Dez 2004, 18:29
Findest du auch das richtige Fenster? Alle Dialoge die mit dem Ressourcen-Editor vom VS gemacht wurden, haben standardmäßig die Klasse #32770.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Totti
Totti

Registriert seit: 1. Dez 2004
Ort: Harrislee
59 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme

  Alt 1. Dez 2004, 18:32
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?
Malte
  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 22:30 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