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 Ein Handle herausfinden bei einer nicht eindeutigen Klasse (https://www.delphipraxis.net/14164-ein-handle-herausfinden-bei-einer-nicht-eindeutigen-klasse.html)

gekmihesg 3. Jan 2004 17:53


Ein Handle herausfinden bei einer nicht eindeutigen Klasse
 
Hi

ich versuche das handle eines buttons herauszufinden (mit findwindowex).
allerdings liegt dieser button in einem fenster das keine eindeutige fensterklasse hat und keinen titel. wenn ich jetzt versuche das parentfenster herauszufinden findet er mal das eine und mal das andere. also kann der button nur manchmal geklickt werden.
was soll ich da machen?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var h: HWnd;
begin
  h:=FindWindow('#32770',nil); //#32770 ist die fensterklasse (zweimal vorhanden)
  h:=FindWindowEx(h,0,'Button','ChannelUp'); //liefert manchmal ergebnis und manchmal nicht
  SendMessage(h,BM_CLICK,0,0);
end;

Luckie 3. Jan 2004 17:56

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
Geh die Child-Fenster mit EnumChildWindows rekursiv durch. Die Beschriftung des Buttons scheint ja eindeutig zu sein.

CalganX 3. Jan 2004 17:57

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
Hi,
du sagst es direkt: Es existieren zwei Fenster dieser Fensterklasse. Dem entsprechend musst du auch zwei mal suchen und darauf reagieren. Lässt sich lösen per EnumWindows und/oder dem Text des Windows.

Chris

[edit]Satz korrigiert.[/edit]

Luckie 3. Jan 2004 18:01

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
Zitat:

Zitat von Chakotay1308
Das Handle existiert zweimal.

Sollte das der Fall sein, würde ich mir ernsthafte Sorgen machen. Ein Handle kann es zu einem Zeizpunkt im System nur einmal geben!

gekmihesg 3. Jan 2004 18:05

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
nein nicht das handle 2mal sondern die fensterklasse

und kann mir jemand des mit dem EnumChildWindows erklären?
am besten mal in den code einbauen und dann posten...

Luckie 3. Jan 2004 18:13

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
Solltest du selber hinbekommen: Hier im Forum suchenEnumchildwindows

SirThornberry 3. Jan 2004 18:17

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
Delphi-Quellcode:
var C: Array[0..256] Of Char;
    winhandle, handle2: Cardinal;
begin
  WinHandle := FindWindow(Nil, Nil);
  While (WinHandle <> 0) Do
  Begin
    windows.GetClassname(WinHandle, C, 255);
    if string(C) = '32770' then
    begin
      //überprüfen ob parentwindow das richtige ist
      handle2 := GetWindow(WinHandle, GW_OWNER);
      windows.GetClassname(handle2, C, 255);
      if string(C) = 'classname vom parentwindow' then
      begin

      end;
    end;
    WinHandle := GetWindow(WinHandle, GW_HWNDNEXT);
  End;
end;
bei bedarf eventuell noch fenstertitel abfrage einbauen

CalganX 3. Jan 2004 18:18

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
Hi Luckie,
sorry... mein Fehler: ich meinte eigentlich, dass zwei Fenster dieser Klasse existieren. 2 mal das gleiche Handle für verschiedene Controls wäre wirklich schlecht. ;)

Chris

gekmihesg 3. Jan 2004 18:48

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
ok soweit hab ich jetzt:

Delphi-Quellcode:
function FindButton(const AhWindow : DWORD;const ApButton : PDWORD) : longbool; stdcall;
var h:Hwnd;
begin
  Result := true;
  showmessage(inttostr(AhWindow));
  h:=findwindowex(AhWindow,0,'Button','ChannelUp');
  ApButton^:=h;
  if h <> 0 then result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var h, hbutton: Hwnd;
begin
h:= findwindow(nil, 'InterVideo WinDVR');
hbutton:=0;
windows.EnumChildWindows(h,@findbutton,integer(@hbutton));
showmessage(inttostr(hbutton));
end;
aber er findet den button nicht weil er vorher ein child findet das selber nochmal childs hat und dann diese child-childs durchgeht und dann abbricht wenn er mit denen fertig is.

F.W. 3. Jan 2004 19:41

Re: Ein Handle herausfinden bei einer nicht eindeutigen Klas
 
Ich weiß ja nicht, ob das geht, aber ich benutze in letzter Zeit immer wieder (geht so schön leicht und ist variabel) WindowFromPoint. Wenn man Die Position deines Handles irgendwann mal mit dem Mauszeiger erwischt, kann das dir helfen:

Delphi-Quellcode:
var
 H: THandle;
begin
 H := WindowFromPoint(Mouse.CursorPos);
   {...}
end;
Das wäre z.B. in eine LabelMouseUp procedure eizubinden, dann musst du nur auf das Label klicken, geklickt halten, zu denerm Hanlde fahren und die Maustaste loslassen. Oder du schiebst das ganze in die FormKeyPress procedure rein, dann musst du nur die Maus positionieren und auf Tastendruck hast du dein Handle! (Dabei muss allerdings die Form aktiv sein, wegen Keydown).

Wenn dich das interessiert kannst du ja mal auf die Seite schauen:
http://www.delphipraxis.net/topic15877 ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 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-2025 by Thomas Breitkreuz