Höhe der Taskleiste ermitteln (o. mit advapi Betriebssystem)

Übersicht BlitzBasic BlitzPlus

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

ozzi789

BeitragDi, Nov 29, 2011 9:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, nachdem ich den ersten Post gelesen habe, dachte ich es geht um das OS...


Schau mal dort vorbei
http://winsharp93.wordpress.co...e-taskbar/
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Thunder

BeitragDi, Nov 29, 2011 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Sereyanne:

mpmxyz wollte darauf hinaus, dass unter BlitzMax ClientHeight(Desktop()) die Höhe des Desktops exklusive Taskleiste und GadgetHeight(Desktop()) die Höhe inklusive Taskleiste zurückgibt, woraufhin du mit GadgetHeight(Desktop())-ClientHeight(Desktop()) die Höhe der Taskleiste ermitteln könntest - das scheint aber bei BlitzPlus nicht zu funktionieren. Beide Funktionen geben denselben Wert zurück, nämlich den inklusive Taskleiste.
Ich habe jetzt auch probiert den DesktopBuffer() zu aktivieren und GraphicsHeight() auszulesen, aber das gibt auch denselben Wert - d.h. du musst wahrscheinlich über die Windows API gehen.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

The Shark

BeitragDi, Nov 29, 2011 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Andere Möglichkeit wäre, ein fenster zu erstellen, zu maximieren und dann die Position und Ausmaße auszulesen. So kann man gleich feststellen, wo sich die Taskleiste befindet. Man könnte ausprobieren, ob das ganze auch mit einem unsichtbare Fenster funktioniert, sonst blitzt halt kurz ein Fenster auf.
Rette deine Freiheit

Sereyanne

BeitragDi, Nov 29, 2011 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi789 hat Folgendes geschrieben:
Achso, nachdem ich den ersten Post gelesen habe, dachte ich es geht um das OS...


Schau mal dort vorbei
http://winsharp93.wordpress.co...e-taskbar/

Ja, im ersten Post ging es auch noch um das OS, aber ich musste feststellen, dass dieser Weg Käse ist Wink.
Danke für den Link, der ist ja wirklich klasse - leider hab ich davon keine Ahnung Embarassed . Ist das C? C++? Kann mir das einer übersetzen Wink

Thunder hat Folgendes geschrieben:
mpmxyz wollte darauf hinaus, dass unter BlitzMax ClientHeight(Desktop()) die Höhe des Desktops exklusive Taskleiste und GadgetHeight(Desktop()) die Höhe inklusive Taskleiste zurückgibt, woraufhin du mit GadgetHeight(Desktop())-ClientHeight(Desktop()) die Höhe der Taskleiste ermitteln könntest - das scheint aber bei BlitzPlus nicht zu funktionieren. Beide Funktionen geben denselben Wert zurück, nämlich den inklusive Taskleiste.

Genau diese Erfahrung habe ich auch schon gemacht Wink

The Shark hat Folgendes geschrieben:
Andere Möglichkeit wäre, ein fenster zu erstellen, zu maximieren und dann die Position und Ausmaße auszulesen. So kann man gleich feststellen, wo sich die Taskleiste befindet. Man könnte ausprobieren, ob das ganze auch mit einem unsichtbare Fenster funktioniert, sonst blitzt halt kurz ein Fenster auf.

Diese Idee kam mir heute morgen auch schon. Gleich ausprobiert - funzt aber nicht. Meine Auflösung 1280x1024 wird einwandfrei angezeigt. Habe dann ein Fenster erstellt, maximiert - und der Debuglog spuckt als Höhe 1030 aus. Wie kann denn das Fenster größer sein als die Desktop-Auflösung????

Thunder hat Folgendes geschrieben:
Ich habe jetzt auch probiert den DesktopBuffer() zu aktivieren und GraphicsHeight() auszulesen, aber das gibt auch denselben Wert - d.h. du musst wahrscheinlich über die Windows API gehen.

Und wie geht das? Mit der Win api bin ich noch nicht so vertraut. Embarassed Embarassed

ozzi789

BeitragDi, Nov 29, 2011 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
win = CreateWindow ("TEST", 100,100,100,100,Desktop(),15)
MaximizeWindow win
HideGadget win

   DebugLog  "WINDOWHEIGHT "+(GadgetHeight(win)-8)
   DebugLog  "WINDOWWIDTH "+(GadgetWidth (win)-8)
   
   DebugLog  "SCREENHEIGHT "+(ClientHeight(Desktop()))
   DebugLog  "SCREENWIDTH "+(ClientWidth(Desktop()))
   
   DebugLog  "TASKBAR HEIGHT "+((ClientHeight(Desktop()))-(GadgetHeight(win)-8))

   Delay(20000)
   

End


Funktioniert doch prächtig....! (Sofern ich Paint glauben schenken darf das meine Taskleiste wirklich 44px hoch ist)
Die 8px die ich abziehe, keine Ahnung, so stimmts einfach Twisted Evil

2 Dinge muss man noch ergänzen

-Falls 2 Bildschirme angeschlossen sind, und die Taskleiste auf dem Sekundären liegt (funktioniert ab Win7) gibt ClientHeight(Desktop()) bloss die vom Primären aus) -> Gibt sicher ne Funktion die dir die Auflösungen beider geben kann

-Falls die Taskleiste senkrecht ist, müsste man das mathematisch auch noch abfangen


Ich verlange einen Orden!
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Sereyanne

BeitragMi, Nov 30, 2011 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi789 hat Folgendes geschrieben:
Ich verlange einen Orden!

Deinen Orden kannst du haben! Vielen Dank für die Mühe!

Aaaaaaaber.............! Twisted Evil Bei mir stimmts nicht, fürchte ich.
Mein Debugger spuckt bei deinem Code aus:
Zitat:
WINDOWHEIGHT 992
WINDOWWIDTH 1288
SCREENHEIGHT 1024
SCREENWIDTH 1280
TASKBAR HEIGHT 32

Auflösung ist ja okay. Fenstergröße glaub ich jetzt einfach mal Cool Aber hatten wir nicht gesagt, dass die Taskleiste in Win 7 48 Pixel hoch ist?

mpmxyz hat Folgendes geschrieben:
So bekomme ich hier als Ergebnis, dass die Windows 7-Taskleiste 48 Pixel hoch ist.

OK ich hab grad mal selber mit Paint nachgemessen. Ich komme auf 42, ist immer noch eine ziemlich große Differenz zu dem Ergebnis aus deinem Code.

Man das kann doch nicht so schwer sein!! Crying or Very sad

Holzchopf

Meisterpacker

BeitragDo, Dez 01, 2011 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Via Google nach "get hwnd taskbar" (einfach mal ins Blinde geraten) bin ich auf diese Seite der msdn gestossen, wo ich Zitat:
To retrieve the size of the work area, call the SystemParametersInfo function with the SPI_GETWORKAREA value set.
gelesen habe.

Diese Infos habe ich mal genommen und folgendermassen zusammengefasst für BlitzMax: [AUSKLAPPEN]
SuperStrict

Extern "win32"
Function SystemParametersInfoW:Int(uiAction:Int, uiParam:Int, pvParam:Byte Ptr, fWinIni:Int)
End Extern

Local retr:Byte Ptr = MemAlloc(16)

SystemParametersInfoW($30,0,retr,0)

For Local a:Int = 0 Until 4
Print Int Ptr(retr)[a]
Next


Jetzt könnte man das ganze bestimmt noch schön in eine RECT-Struktur dingsen und so, aber darauf hatte ich keine Lust mehr.

Ich hoffe, es ist das, was du suchst.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

mpmxyz

BeitragDo, Dez 01, 2011 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@Sereyanne
Ich habe auch nachgemessen:
user posted image
Meine Taskleiste hat eine Höhe von 48 px.
Warum gibt es da unterschiedliche Größen?
Mein Testcode ist übrigens:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Framework brl.StandardIO
Import MaxGUI.Drivers

Print (GadgetHeight(Desktop())-ClientHeight(Desktop()))

MfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

ozzi789

BeitragDo, Dez 01, 2011 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab ne klassische Ansicht..

Der Code von Holzchopf ist natürlich sehr nice, kannst den external Call in ne decls pappen und verwenden Very Happy
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Sereyanne

BeitragFr, Dez 02, 2011 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Holzchopf hat Folgendes geschrieben:
Diese Infos habe ich mal genommen und folgendermassen zusammengefasst für BlitzMax

Dankeschön. Nur doof, dass wir hier im Bereich BlitzPlus sind - ich hab nämlich kein Max Sad

mpmxyz hat Folgendes geschrieben:
Meine Taskleiste hat eine Höhe von 48 px.
Warum gibt es da unterschiedliche Größen?

Das ist eine gute Frage! Ich habe Win 7 Ultimate. Gibts da Versionsunterschiede oder mach ich mit meinem Paint irgendwas falsch?? Bei mir bleiben es 42.

ozzi789 hat Folgendes geschrieben:
Der Code von Holzchopf ist natürlich sehr nice, kannst den external Call in ne decls pappen und verwenden Very Happy

Haha.... dann mach mal bitte... ich kann das nicht Embarassed

ozzi789

BeitragSa, Dez 03, 2011 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil es bald weihnachten ist...
Funktioniert für den primären Bildschirm.


Code: [AUSKLAPPEN]
Type sysparam
   Field empty1
   Field empty2
   Field empty3
   Field height
End Type

Local n.sysparam
n = New sysparam
SystemParametersInfo($30,0,n, 0)
Print ClientHeight(Desktop())-n\height



WaitKey
End


Und die user32.decls

Code: [AUSKLAPPEN]
.lib "user32.dll"
SystemParametersInfo%(uiAction%, uiParam%, pvParam*, fWinIni%) : "SystemParametersInfo"
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Sereyanne

BeitragSa, Dez 03, 2011 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi789 hat Folgendes geschrieben:
Weil es bald weihnachten ist...
Funktioniert für den primären Bildschirm.

Haha... ja herrlich vielen Dank. Von mir aus kannst du auch gerne zwei Orden haben Wink
Nur irgendwas mach ich noch falsch. Hab deinen Code in die decls gepackt, den anderen Code ins Plus kopiert, und dann markiert der Debugger "SystemParametersInfo($30,0,n, 0) "
---------------------------
Runtime Error
---------------------------
User lib function not found
---------------------------
OK
---------------------------


edit
Hey Leute, ich hab jetzt ne Idee. Hab mal n bisschen rumgespielt. Unter der Woche bin ich einfach zu nix gekommen, aber dafür jetzt Very Happy
Ich hab jetzt die Lösung dafür, warum ozzi 8 Pixel abziehen musste.
Stichwort: Rand.
Ich habe festgestellt, dass mein Fenster über maximizewindow 1000 Pixel groß ist. Bei einer Desktopauflösung von 1280*1024 ergibt das eine Taskleistengröße von 1024-1000=24 Pixel. Das kann nicht sein. Wenn ich das Fenster einfach nur erstelle ohne zu maximieren, und es dann mit der Maus bis an die Taskleiste ziehe, zeigt der Debugger einen Wert von 984. Jetzt haben wir eine Taskleistengröße von 1024-984=40 Pixel. OK, ich kam im Paint auf 42, diese geringe Abweichung lass ich jetzt mal gelten. Das würde bedeuten, dass der Rand des Fensters beim Maximieren und nicht Maximieren einen Unterschied von 16 Pixel ausmacht. Deswegen hat ozzi auch 8 Pixel abgezogen - nämlich 1 x den Rand.

Probiert mal bitte folgendes und erstattet mir dann mal Bericht Cool
Code: [AUSKLAPPEN]
desktophoehe=ClientHeight(Desktop())
desktopbreite=ClientWidth(Desktop())

win=CreateWindow("fenster",0,0,500,500,Desktop())
MaximizeWindow win

Repeat
   WaitEvent
      Select EventID()
      Case $803
         End
      End Select

fensterbreite=GadgetWidth(win)
fensterhoehe=GadgetHeight(win)

DebugLog "desktop "+desktopbreite+" x "+desktophoehe
DebugLog "fenster "+fensterbreite+" x "+fensterhoehe

Forever
End

Der Code mag jetzt nicht der beste sein, aber ich denke, er zeigt das Problem mit dem Rand, wie ich oben beschrieben habe.
Oder wie seht ihr das?

ozzi789

BeitragSa, Dez 03, 2011 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du das mit der decls richtig machst und deine IDE neustartet funktioniert das Rolling Eyes
Hat hier zumindest auf 2 PC's...
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

ozzi789

BeitragMi, Dez 07, 2011 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hats geklappt..?
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Sereyanne

BeitragMi, Dez 07, 2011 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nee, danke der Nachfrage, aber ich kann die IDE so oft neustarten, wie ich will, der Fehler bleibt leider bestehen.

Warum äußert sich eigentlich keiner zu meinem Randproblem? Ich hab leider nur Win 7 zur Verfügung. Es würde mich freuen, wenn mein Code auch mal auf anderen Betriebssystemen getestet würde. Die Ergebnisse würden mich mal interessieren!

ZEVS

BeitragMi, Dez 07, 2011 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Building untitled2
Compiling:untitled2.bmx
flat assembler  version 1.69.14  (471646 kilobytes memory)
3 passes, 4597 bytes.
Linking:untitled2.debug.exe
Executing:untitled2.debug.exe
DebugLog:desktop 1152 x 834
DebugLog:fenster 1160 x 842
DebugLog:desktop 1152 x 834
DebugLog:fenster 1160 x 842
DebugLog:desktop 1152 x 834
DebugLog:fenster 1160 x 842
DebugLog:desktop 1152 x 834
DebugLog:fenster 1160 x 842
DebugLog:desktop 1152 x 834
DebugLog:fenster 1160 x 842
DebugLog:desktop 1152 x 834
DebugLog:fenster 1160 x 842

Process terminated

WindowsXP Service Pack 2. Keine Veränderung an der Default-Taskleiste. BMax 1.45.
Komischerweise ist das Fenster größer als der Desktop.
Es gibt einen Breitenunterschied von 8px (woher auch immer) und einen Höhenunterschied von 8px, wobei meine Taskleiste nach GIMP 31px hoch ist. Meine Bildschirmauflösung beträgt 1152x864.

ZEVS

Sereyanne

BeitragMi, Dez 07, 2011 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
ZEVS hat Folgendes geschrieben:
Komischerweise ist das Fenster größer als der Desktop.
Es gibt einen Breitenunterschied von 8px (woher auch immer) und einen Höhenunterschied von 8px, wobei meine Taskleiste nach GIMP 31px hoch ist. Meine Bildschirmauflösung beträgt 1152x864.

ZEVS

Ja, genau das sage ich doch die ganze Zeit!!! Also stimmst du mir zu, dass man den Rand abziehen muss?

ZEVS

BeitragMi, Dez 07, 2011 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist es wohl. Das Fenster ist größer als der Bildschirm, k.A., was Windows hier macht. Auf jeden Fall ist der Rand gleich GadgetWidth-ClientWidth.

Die Sache wird witziger: Wenn ich das ganze mal mit B+ laufen lasse, dann bekomme ich für die Desktophöhe meine 864px raus.

Zur Taskleiste: 864-842 = 22. Das sind mir 9px zu wenig, also unzureichend. Eine finale Formel kann wohl nur ein umfangreiches Debuggen (evtl. unter Einbeziehung von GadgetX/GadgetY) bringen.
Obwohl die userlib-Methode einfach etwas für sich hat Wink .

ZEVS

Sereyanne

BeitragMi, Dez 07, 2011 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ZEVS hat Folgendes geschrieben:
Das ist es wohl. Das Fenster ist größer als der Bildschirm, k.A., was Windows hier macht

Du hast mich soeben auf eine Idee gebracht. Warum kann man denn das Fenster nicht mit den Client-Befehlen anstatt mit Gadget auslesen?

Code: [AUSKLAPPEN]
desktophoehe=ClientHeight(Desktop())
desktopbreite=ClientWidth(Desktop())

win=CreateWindow("fenster",0,0,0,0,Desktop())
MaximizeWindow win
fensterbreite=[color=red]ClientWidth(win)[/color]
fensterhoehe=[color=red]ClientHeight(win)[/color]
taskleiste=desktophoehe-fensterhoehe

DebugLog "desktop "+desktopbreite+" x "+desktophoehe
DebugLog "fenster "+fensterbreite+" x "+fensterhoehe
DebugLog "task "+taskleiste

HideGadget win

Repeat
   WaitEvent
      Select EventID()
      Case $803
         End
      End Select
Forever
End

Es scheint zu gehen. Mein Fenster ist jetzt endlich kleiner als der Desktop *rofl*.
Aber warum ist meine Taskleiste jetzt 104 Pixel hoch?? Das erscheint mir jetzt doch recht viel. Was für Ergebnisse produziert dieser Code bei euch?

ZEVS

BeitragDo, Dez 08, 2011 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
96...
Das liegt wohl an dem Fensterrahmen. Wenn ich als Style 0 angebe, habe ich eine Taskleistenhöhe von 0... Es ist zum Mäuse melken... Evil or Very Mad

ZEVS

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group