API-Befehle für die SysTray

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

API-Befehle für die SysTray

Beitrag von es_91 »

Hallo

Ich habe mit meinem Windows 10 öfters das Anliegen mit der Funktion "Systemleiste automatisch ausblenden". Diese Einstellung schalte ich je nach Anwendungsgewohnheiten an und ab, oft mehrmals am Tag. Es ist ein Bisschen aufwändig, das jedes mal über die Systemeinstellung zu tätigen, zumal diese bis zu 8 Sekunden benötigt um die entsprechende Seite der Taskleiste anzuzeigen.

Ich würde gern ein kleines Tool schreiben um per Knopfdruck diese Einstellung zu alternieren. Kennt dafür jemand die Befehlszeile die man Windows schicken muss?

LG
Axolotl
Beiträge: 150
Registriert: 31.12.2008 16:34

Re: API-Befehle für die SysTray

Beitrag von Axolotl »

Moin,

mit der Info
findet man im englischen Forum:
Taskleiste verstecken

Das entspricht den C/C++/C# Beispielen, die es ausserhalb des PB Kosmos gibt...
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: API-Befehle für die SysTray

Beitrag von es_91 »

Ungeachtet der eigentlichen Aufgabenstellung - vielen Dank! Sie lässt sich so wie jedes Fenster unter Windows unsichtbar machen:

Code: Alles auswählen

ShowWindow_   (   findWindow_   (   "Shell_TrayWnd",   0   ),   #SW_HIDE   )

Allerdings suche ich die Funktion "Taskleiste automatisch ausblenden": Bei dieser Einstellung verbleibt von der SysTray eine ein- bis zwei Pixel große Restzeile am Bildschirmrand, die bei Berührung durch den Mauszeiger die komplette Leiste zurückbringt. Das ist ja beim Verstecken der Zeile nicht gegeben - sie ist dann komplett weg.


Windows geht hier schon immer den Weg, dass die eingezogene Systemleiste sich über andere Apps legt, während sie bei voller Darstellung die Rahmen jeder App verdrängt. Beim plumpen Verstecken der Leiste bleiben alle Apps auf alter Distanz zum Rand,. so als wäre die Leiste noch da.


Ich muss gerade feststellen, dass der Ansatz dieses manchmal nervige Zeilchen einfach abzubestellen gar nicht so unpraktisch daherkommt, wie ich zuerst annahm. Die Fahnentaste funktioniert immer noch und zeigt das Startmenü neben der unsichtbaren Leiste an und die Apps können per Tab+Alt durchgeschalten werden.
Zuletzt geändert von es_91 am 19.03.2024 06:53, insgesamt 1-mal geändert.
Axolotl
Beiträge: 150
Registriert: 31.12.2008 16:34

Re: API-Befehle für die SysTray

Beitrag von Axolotl »

vielleicht kann dir die function SystemParametersInfo() weiterhelfen.

Code: Alles auswählen

Procedure ShowHideTaskBar(bHide = #False) ;   
  Protected hwnd, rectWorkArea.RECT, rectTaskBar.RECT 

 hwnd = FindWindow_(“Shell_TrayWnd”, 0) 
 if bHide 
  ;// Code to Hide the System Task Bar 
  SystemParametersInfo_(#SPI_GETWORKAREA, 0, @rectWorkArea, 0)
  if hwnd 
   GetWindowRect_(hwnd, @rectTaskBar) 
   rectWorkArea\bottom + (rectTaskBar\bottom - rectTaskBar\top)  
   SystemParametersInfo_(#SPI_SETWORKAREA, 0, @rectWorkArea, 0)
   ShowWindow(hwnd, #SW_HIDE)
  endif 
 else
  ; // Code to Show the System Task Bar
  SystemParametersInfo(#SPI_GETWORKAREA, 0, @rectWorkArea, 0)
  if hwnd 
   GetWindowRect_(hwnd, @rectTaskBar) 
   rectWorkArea\bottom - (rectTaskBar\bottom - rectTaskBar\top) 
   SystemParametersInfo_(#SPI_SETWORKAREA, 0, @rectWorkArea, 0) 
   ShowWindow_(hwnd, SW_SHOW)
  endif 
 endif 
EndProcedure  
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: API-Befehle für die SysTray

Beitrag von es_91 »

Axolotl

soweit ich sehe nutzt Dein Code nur die Möglichkeit, die Zeile (das Window) zu verstecken. Derlei gibt es sicherlich einige Wege. Die Funktion SystemParametersInfo() schaue ich mir einmal an.

Das ist allerdings nicht das wonach ich suche. Ich möchte Windows den Befehl schicken, die "Taskleiste automatisch ausblenden"-Funktion zu starten, damit die Taskleiste eingefahren wird.

Hier ist Dein Codeexempel nochmal in reparierter Fassung (der Syntax-Dialekt ist PureClean):

Code: Alles auswählen


procedure   hideSysTrayBar   (   doHide   =   #false   )
	
	protected   hWnd
	protected   rectWorkArea   .RECT
	protected   rectTaskBar   .RECT
	
	hWnd   =   findWindow_   (   "Shell_TrayWnd",   
	                             #null   ) 
	
	if   (   doHide   )
		
		systemParametersInfo_   (   #spi_getWorkArea,   
		                            #null,   
		                            @ rectWorkArea,   
		                            #null   )
		
		if   (   hWnd   )
			
			getWindowRect_   (   hWnd,   
			                     @ rectTaskBar   )
			
			rectWorkArea\   bottom   +   (   rectTaskBar\   bottom   +   
			                                 -   rectTaskBar\   top   )
			
			systemParametersInfo_   (   #spi_setWorkArea,   
			                            #null,   
			                            @ rectWorkArea,   
			                            #null   )
			
			showWindow_   (   hWnd,   
			                  #SW_HIDE   )
			
		endIf
		
	else
		
		systemParametersInfo_   (   #spi_getWorkArea,   
		                            #null,   
		                            @ rectWorkArea,   
		                            #null   )
		
		if   (   hWnd   )
			
			getWindowRect_   (   hWnd,   
			                     @ rectTaskBar   )
			
			rectWorkArea\   bottom   -   (   rectTaskBar\   bottom   +   
			                                 -   rectTaskBar\   top   )
			
			systemParametersInfo_   (   #spi_setWorkArea,   
			                            #null,   
			                            @ rectWorkArea,   
			                            #null   )
			
			showWindow_   (   hWnd,   
			                  #SW_SHOW   )
			
		endIf
		
	endIf
	
endProcedure



hideSysTrayBar   (   #true   )


delay   (   6000   )


hideSysTrayBar   (   #false   )

Axolotl
Beiträge: 150
Registriert: 31.12.2008 16:34

Re: API-Befehle für die SysTray

Beitrag von Axolotl »

Hey es_91,

tut mir Leid, dass ich dir nicht helfen kann.
Vielleicht ist ja die Registry eine Möglichkeit. (Ohne Gewähr)
Z.B. der Schlüssel HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3

Ich habe es nicht probiert, da ich das nicht wirklich brauche. Aber ich würde so vorgehen, dass ich mir den Schlüssel speichern würde und dann die Änderung händisch durchführe und anschließend den Schlüssel erneut speichern.
Der Vergleich sollte dann ggf. die durchzuführenden Änderurngen ergeben. Dass kann man dann nachprogrammieren.
Vielleicht muss der Explorer auch neu gestartet werden, damit die Änderungen übernommen werden.......

Achtung: Bei Registry Änderungen gilt immer äußerste Vorsicht. Also auf eigenes Risiko!
Viel Erfolg.
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Antworten