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 Kleine API-Fragen (https://www.delphipraxis.net/38108-kleine-api-fragen.html)

shareholder 14. Jan 2005 20:20


Kleine API-Fragen
 
1.) Wie ermittle ich die ID, wenn ich den Handle eines Fensters bereits habe?

2.) Wie lese ich die Styles / StylesEx eines Fensters aus, dessen Handle ich auch bereits habe?

Dax 14. Jan 2005 20:26

Re: Kleine API-Fragen
 
Zu 2): Für die normalen Styles
Delphi-Quellcode:
Styles := GetWindowLong(Handle, GWL_STYLE);
und für die ExStyles
Delphi-Quellcode:
ExStyles := GetWindowLong(Handle, GWL_EXSTYLE);
Für die ID weiß ich leider nichts..

toms 14. Jan 2005 20:29

Re: Kleine API-Fragen
 
zu 1)

Delphi-Quellcode:
ID := GetWindowLong(Handle, GWL_ID);

shareholder 14. Jan 2005 20:47

Re: Kleine API-Fragen
 
Ich danke Euch! :)

Aber wie werte ich den LONG-Wert nun aus? Ich meine, ich habe jetzt bsp.: 256 zurückbekommen. (Beim ermitteln der Styles)

Wie komme ich jetzt zu den Angaben à la WS_BORDER... ? :thumb:

Dax 14. Jan 2005 20:49

Re: Kleine API-Fragen
 
Den Wert durchgehend unter Verwendung von and mit den Stale-Werten verknüpfen. Wenn das Resultat größer als Null ist, ist der gewählte Style gesetzt ;)

shareholder 14. Jan 2005 20:55

Re: Kleine API-Fragen
 
Ich habe dich so verstanden,
aber das ist wohl falsch. :???:

Code:
// C++ - Variante

  if((WS_THICKFRAME && Styles) > 0)
    ShowMessage("Der Style ist aktiv");
Wie meinst du's also genau? :) Danke!

Dax 14. Jan 2005 21:02

Re: Kleine API-Fragen
 
Genau so hab' ich das gemeint, aber so ist es am besten:
Delphi-Quellcode:
if Style and WS_BORDER = WS_BORDER then
  ShowMessage('Style ist aktiv.');

shareholder 14. Jan 2005 21:23

Re: Kleine API-Fragen
 
Habe gerade praktisch ein paar Probleme... aber das passt schon. :)

Gibt es eine Möglichkeit, aus dem Long-Wert - bspw. 524288 - den Stylenamen (in diesem Fall WS_SYSMENU) zurückgeben zu lassen?



Ist die Andverknüpfung logisch oder bitweise? Ersteres hätte doch keinen Sinn, oder?
Mein Problem... Muss meine Variable "Style" nicht immer 0 sein, damit die "Ja, der Style ist aktiv"-Meldung erscheint?

Dax 14. Jan 2005 21:28

Re: Kleine API-Fragen
 
Die Verknüpfung ist Bitweise, also erübrigt sich deine zweite Frage: Nur wenn die Bits in Style dort gesetzt sind wie die Bits im Styleflag (z.B. WM_BORDER), gibt die Operation etwas über 0 zurück. Es liegt in der Natur der and-Operation, das als Ergebnis immer 0 herauskommt, wenn ein Operand 0 ist ;)

Aber jetzt zur ersten: Der einzige Weg ist, deinen Wert mit and nach allen möglichen Styles durchzurastern und dann den Namen des Styles zurückzugeben.

shareholder 14. Jan 2005 22:02

Re: Kleine API-Fragen
 
sollte dann nicht:

Code:
if Style and WS_BORDER = WS_BORDER then
  ShowMessage('Style ist aktiv.');
besser

Code:
if Style and WS_BORDER > 0 then
  ShowMessage('Style ist aktiv.');
heißen? :shock: Wie auch immer, es funktioniert jetzt! :=)

--

Wenn ich nun sinnvoll alle Styles durchgehen möchte, sollte ich mit einer
Schleife durch ein Array switchen, gell? :angel:

Dax 14. Jan 2005 22:05

Re: Kleine API-Fragen
 
Einfach alle Styles a hintuschreiben und dann mit AND zu verknüpfen ginge auch, aber die Arraylösung ist praktikabler. ABER: Es muss schon Style and Value = Value heissen, denn sonst kannst du nicht sicher sein, das der Style "Value" auch garantiert gesetzt ist ;)

shareholder 14. Jan 2005 22:19

Re: Kleine API-Fragen
 
Code:
// C++, da ich hier auf dem PC kein Delphi installiert habe. :( 

if((WS_SYSMENU & Styles) == WS_SYSMENU)
      ShowMessage("WS_SYSMENU & Styles");

          if((WS_OVERLAPPED & Styles) == WS_OVERLAPPED)
      ShowMessage("WS_WS_OVERLAPPED & Styles");

          if((WS_GROUP & Styles) == WS_GROUP)
      ShowMessage("WS_WS_GROUP & Styles");

          if((WS_DLGFRAME & Styles) == WS_DLGFRAME)
      ShowMessage("WS_DLGFRAME & Styles");

Funktioniert nicht. In jedem Fall promt die Message Box auf...

Woran kann's denn liegen? :o

Edit: Habe das Ergebnis mit Winspektor überprüft. Nur die ersten 2 Styles existieren...

Christian Seehase 14. Jan 2005 23:04

Re: Kleine API-Fragen
 
Moin Shareholder,

das kann eigentlich nicht sein.
Welchen Wert hat Styles?

shareholder 14. Jan 2005 23:36

Re: Kleine API-Fragen
 
Die Style-Var hat den Wert: -1798701056

Hat eigentlich jedes Fenster (ausnahmslos) ein Handle?

Danke für deine Hilfe noch um diese Uhrzeit. :)

Luckie 14. Jan 2005 23:38

Re: Kleine API-Fragen
 
Negativ? :shock: Das kann nicht sein, da alle Styles DWORD Werte sind und ein DWORD kann nicht negativ werden.

Zur Frage: Jaein. Ein TLabel hat kein Handle, da es von TGrafikControl abgeleitet ist. Ist aber genau genommen auch kein Fenster.

Dax 14. Jan 2005 23:40

Re: Kleine API-Fragen
 
Ich schätze mal, shareholder hat Style mit IntToStr bearbeitet, da ist das 31. Bit das Vorzeichen. Stimmts, Luckie? ;)

Luckie 14. Jan 2005 23:42

Re: Kleine API-Fragen
 
Auch bei einem DWORD knn das 31. Bit nicht das Vorzeichen haben, da es keins hat.

Dax 14. Jan 2005 23:44

Re: Kleine API-Fragen
 
Aber beim Integer ist das so, und IntToStr behandelt das DWORD doch wie einen Integer ;)

shareholder 14. Jan 2005 23:44

Re: Kleine API-Fragen
 
Code:
Edit1->Text = Styles;
Ich habe keine Typenkonvertierung vorgenommen, weil ich nicht weiß wie's geht. :???:

Hoffe es liegt nicht daran... mhhh

shareholder 14. Jan 2005 23:50

Re: Kleine API-Fragen
 
Code:
if(Styles == -1798701056) ShowMessage("Die Zahl stimmt so! :=)");
Das Fenster poppt auf. Anscheinend ist das Vorzeichen wirklich negativ.

Christian Seehase 14. Jan 2005 23:50

Re: Kleine API-Fragen
 
Moin Shareholder,

ich weiss nicht, was Du willst ;-)
Der von Dir genannte Wert ist hexadezimal 94CA0000.

Die Werte der Konstanten sind (hex)
0000 0000 (WS_OVERLAPPED)
0008 0000 (WS_SYSMENU)
0002 0000 (WS_GROUP)
0040 0000 (WS_DLGFRAME)

Macht zusammen:
004A 0000

00C0 0000 ist gleich 0080 0000 or 0040 0000

also sind alle Styles in dem Wert enthalten.

Der Winspector scheint nicht richtig zu funktionieren.

shareholder 15. Jan 2005 00:00

Re: Kleine API-Fragen
 
Sorry, ich bin wohl zu blöd. :wall:

Wie kommst du auf "0080 0000 or 0040 0000" ? :drunken:

Christian Seehase 15. Jan 2005 00:04

Re: Kleine API-Fragen
 
Moin Shareholder,

der Wert enthält an der dritten Stelle hexadezimal C (12 dezimal).
Ich wollte nur deutlich machen, dass dort die 4 enthalten ist.

shareholder 15. Jan 2005 00:20

Re: Kleine API-Fragen
 
Wie kommst du überhaupt auf

Zitat:

Der von Dir genannte Wert ist hexadezimal 94CA0000.
... Kann man eine negative Zahl überhaupt in Hex umwandeln? ...

http://de.selfhtml.org/helferlein/dezhex.htm gibt mir dabei eine Fehlermeldung aus. :gruebel:

Christian Seehase 15. Jan 2005 00:26

Re: Kleine API-Fragen
 
Moin Shareholder,

ob negativ oder positiv ist reine Interpretationssache.
Bei integer wird das höchstwertige Bit als Vorzeichen interpretiert, bei cardinal (bzw. in diesem Falle DWORD) nicht.
Der Windowsrechner kann das problemlos (warum auch nicht).

Lass Dir den Wert mal mit IntToHex ausgeben.
Delphi-Quellcode:
  ShowMessage(IntToHex(-1798701056,8));

shareholder 15. Jan 2005 00:37

Re: Kleine API-Fragen
 
Super Christian! :=)



Habe übrigens gerade das ganze jetzt mit einem Programm hier aus dem Forum getestet (Spy++)

Jetzt wird mir von den 4 Styles (weiter oben im Thread) jeder bis auf WS_GROUP angezeigt.



Zitat:

WS_GROUP
Specifies the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style. The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.

You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use SetWindowLong.
So wie's aber in der MSDN-Hilfe ausschaut besteht dieser Style immer, wenn mindestens eine Komponente auf dem Formular sitzt. :gruebel: Deswegen blended Spy++ diesen Style aus, oder?

shareholder 15. Jan 2005 02:10

Re: Kleine API-Fragen
 
Sind die Konstanten eigentlich (Ich meine die Werte der Konstanten) in jeder Version gleich.
Also, haben diese sich seit Windows95 nicht geändert? Danke! :thumb:

Christian Seehase 15. Jan 2005 02:36

Re: Kleine API-Fragen
 
Moin Shareholder,

die WS_* Konstanten sind in allen Windows Versionen gleich.
(zumindest ist es nicht anders dokumentiert ;-))

shareholder 15. Jan 2005 13:49

Re: Kleine API-Fragen
 
Danke, wieso haben eigentlich eigentlich OVERLAPPED und TILED beide den Wert 0?


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