![]() |
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? |
Re: Kleine API-Fragen
Zu 2): Für die normalen Styles
Delphi-Quellcode:
und für die ExStyles
Styles := GetWindowLong(Handle, GWL_STYLE);
Delphi-Quellcode:
Für die ID weiß ich leider nichts..
ExStyles := GetWindowLong(Handle, GWL_EXSTYLE);
|
Re: Kleine API-Fragen
zu 1)
Delphi-Quellcode:
ID := GetWindowLong(Handle, GWL_ID);
|
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: |
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 ;)
|
Re: Kleine API-Fragen
Ich habe dich so verstanden,
aber das ist wohl falsch. :???:
Code:
Wie meinst du's also genau? :) Danke!
// C++ - Variante
if((WS_THICKFRAME && Styles) > 0) ShowMessage("Der Style ist aktiv"); |
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.'); |
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? |
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. |
Re: Kleine API-Fragen
sollte dann nicht:
Code:
besser
if Style and WS_BORDER = WS_BORDER then
ShowMessage('Style ist aktiv.');
Code:
heißen? :shock: Wie auch immer, es funktioniert jetzt! :=)
if Style and WS_BORDER > 0 then
ShowMessage('Style ist aktiv.'); -- Wenn ich nun sinnvoll alle Styles durchgehen möchte, sollte ich mit einer Schleife durch ein Array switchen, gell? :angel: |
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 ;)
|
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... |
Re: Kleine API-Fragen
Moin Shareholder,
das kann eigentlich nicht sein. Welchen Wert hat Styles? |
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. :) |
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. |
Re: Kleine API-Fragen
Ich schätze mal, shareholder hat Style mit IntToStr bearbeitet, da ist das 31. Bit das Vorzeichen. Stimmts, Luckie? ;)
|
Re: Kleine API-Fragen
Auch bei einem DWORD knn das 31. Bit nicht das Vorzeichen haben, da es keins hat.
|
Re: Kleine API-Fragen
Aber beim Integer ist das so, und IntToStr behandelt das DWORD doch wie einen Integer ;)
|
Re: Kleine API-Fragen
Code:
Ich habe keine Typenkonvertierung vorgenommen, weil ich nicht weiß wie's geht. :???:
Edit1->Text = Styles;
Hoffe es liegt nicht daran... mhhh |
Re: Kleine API-Fragen
Code:
Das Fenster poppt auf. Anscheinend ist das Vorzeichen wirklich negativ.
if(Styles == -1798701056) ShowMessage("Die Zahl stimmt so! :=)");
|
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. |
Re: Kleine API-Fragen
Sorry, ich bin wohl zu blöd. :wall:
Wie kommst du auf "0080 0000 or 0040 0000" ? :drunken: |
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. |
Re: Kleine API-Fragen
Wie kommst du überhaupt auf
Zitat:
![]() |
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));
|
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:
|
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: |
Re: Kleine API-Fragen
Moin Shareholder,
die WS_* Konstanten sind in allen Windows Versionen gleich. (zumindest ist es nicht anders dokumentiert ;-)) |
Re: Kleine API-Fragen
Danke, wieso haben eigentlich eigentlich OVERLAPPED und TILED beide den Wert 0?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 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