Entwickler-Ecke
Windows API - Wie kriege ich raus ob ein Fenster ein Dialogfenster ist
Anonymous - Do 23.01.03 03:34
Titel: Wie kriege ich raus ob ein Fenster ein Dialogfenster ist
Natürlich meine ich hier die API Variante. Was ich habe ist das Fensterhandle. Jetzt würde ich gerne wissen ob es ein Dialogfenster ist.
Kennt einer so eine Funktion.
Delete - Do 23.01.03 10:34
Schau mal nach dem Klassennamen des Fensters.
Dialogfenster haben meist #32???. Die genaue Nummer habe ich leider nicht im Kopf.
Delete - Do 23.01.03 10:38
Aber nur die mit VC erzeugten. Ich wollte das auch erst antworten, dann habe ich mal eine Delphi-Form genommen und ihr den Stil bsDialog gegeben und die Klasse war natürlich immer noch TForm1. So geht es also nicht.
Delete - Do 23.01.03 10:49
Sind das nicht zwei Paar Schuhe?
Ob nun mit VC (bzw. dem VS-Editor) erstellt oder nicht, wenn du einen Dialog mit Borland´s BRCC32 kompilierst, dann sollte der Klassenname wieder den gewohnten Wert #32??? haben.
Mit VCL-Dialogen hat das IMHO nichts zu tun.
Delete - Do 23.01.03 11:34
So, ich noch mal.
1. Dialog-Ressourcen haben, wie bereits erwähnt, den Klassennamen #32770. Zusätzlich ließe sich noch prüfen, ob
Quelltext
1:
| procpointer := pointer(integer(GetWindowLong(aWnd,DWL_DLGPROC))); |
ungleich
nil ist oder nicht. Der gleiche Aufruf liefert bei VCL-Forms und VCL-Dialogen nämlich
nil zurück, da es dort offenbar eine WndProc aber wohl keine DlgProc gibt.
2. Wenn du mal in die "Forms.pas" schaust, Luckie, dann findest du unter "TCustomForms.CreateParams" folgende Zeilen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| bsDialog: begin Style := Style or WS_POPUP or WS_CAPTION; ExStyle := WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE; AddBiDiModeExStyle(ExStyle); if not NewStyleControls then Style := Style or WS_DLGFRAME or DS_MODALFRAME;
{ ... } |
Einen VCL-Dialog mit dem Stil "bsDialog" kann man also mit Hilfe von
Quelltext
1: 2: 3:
| dwExStyle := GetWindowLong(aWnd,GWL_EXSTYLE); if(dwExStyle and WS_EX_DLGMODALFRAME > 0) then ShowMessage('VCL-Dialogstil'); |
"enttarnen".
Delete - Do 23.01.03 11:39
Sag ich doch, dass es nicht nur mit #32770 geht.
So jetzt die 500.000 und 1.000.000 Fragen:
Wie sieht es beim BCB aus und bei VB? 8)
Nachtrag: Ich kann nicht in die Forms.pas kucken, da nicht vorhanden. :?
AndyB - Do 23.01.03 20:10
Luckie hat folgendes geschrieben: |
Wie sieht es beim BCB aus |
Da sieht es genauso aus, wie bei Delphi, da der BCB auf die Pascal-Units der VCL zugreift.
Anonymous - Do 23.01.03 22:14
Wenn ich ehrlich bin, so dachte ich wirklich, daß es eine API Funktion gibt die mir sowas sagen kann. So kann man sich irren.
Was mich angeht, so hab ich das Problem inzwischen anders gelöst.
Das soll aber nich heißen, daß dieses interesante Thema nicht weiter verfolgt werden sollte. Nur ist die Frage inzwischen nicht mehr akut.
Delete - Do 23.01.03 22:17
Und wie hast du es gelöst?
Anonymous - Do 23.01.03 22:46
Die Lösung selbst hat mit Dialogfenstern nichts zu tun. Du kannst dich doch an mein
Problem [
http://www.delphi-forum.de/viewtopic.php?p=30896#30896] erinnern in dem ich das Childwindow über ChildWindowFromPoint gesucht habe. Dabei hatte ich das Problem, daß ChildWindowFromPoint sich auf den Null-Punkt des Parentfensters bezieht. Leider hat ein leeres Normalfenster und Dialogfenster einen anderen Client-Null-Punkt. Also wollte ich über das prüfen nach Dialogfenster zwischen Normalen- und Dialogfenster unterscheiden.
Auf der Suche nach einer IsDialog-Funktion hab ich eine Funktion gefunden die mir direkt den Clientbereich angibt.
Wie du siehst, anders gelöst. Sorry für die Mühe, aber so funktioniert das. Wen man es nicht so lösen kann, dann so.
Delete - Do 23.01.03 23:02
Und welche Funktion liefert dir den direkten Client-Bereich?
Anonymous - Do 23.01.03 23:48
Sorry, ich hab mich vertan. Die Funktion die ich eingebaut habe ist eine Funktion, mit der die Bildschirmkoordinaten eines gegebenen Punktes auf dem Bildschirm in Client-Koordinaten umgerechnet werden (ScreenToClient). Allerdings ist es kein Problem draus den Rectbereich zu berechen, bezogen auf das ChildFenster:
Quelltext
1: 2: 3:
| ScreenToClient(Hwnd, Pos); HwndCh := ChildWindowFromPoint(Hwnd, Pos); GetWindowRect(HwndCh, Rec); |
Delete - Do 23.01.03 23:56
Alles klar, aber pos würde ich nicht als Variablennamen nehmen. Denk mal an die Funktion pos!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!