Set desktop metrics
Posted: Thu Jan 26, 2006 9:13 pm
Is there a good way to set desktop settings, like height/width/frequency?
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
;Open Display Properties, Settings tab.
RunProgram("RUNDLL32.EXE","SHELL32.DLL,Control_RunDLL desk.cpl,@0,3","")
Code: Select all
; www.purearea.net (Sourcecode collection by cnesm)
; Author: Andreas
; Date: 22. November 2003
;#############################
;Author : Andreas
;16.06.2003
;#############################
NewList Display.DEVMODE()
#DM_PELSHEIGHT = $100000
#DM_PELSWIDTH = $80000
#DM_BITSPERPEL = $40000
#DM_DISPLAYFLAGS = $200000
#DM_DISPLAYFREQUENCY = $400000
#DISP_CHANGE_RESTART = 1
#CDS_UPDATEREGISTRY = 1
Procedure.s ReadRegKey(OpenKey.l,SubKey.s,ValueName.s)
hKey.l=0
keyvalue.s=Space(255)
datasize.l=255
If RegOpenKeyEx_(OpenKey,SubKey,0,#KEY_READ,@hKey)
keyvalue="Fehler. Kann Registry nicht lesen"
Else
If RegQueryValueEx_(hKey,ValueName,0,0,@keyvalue,@datasize)
keyvalue="Fehler. Kann Schlüssel nicht lesen"
Else
keyvalue=Left(keyvalue,datasize-1)
EndIf
RegCloseKey_(hKey)
EndIf
ProcedureReturn keyvalue
EndProcedure
Procedure.s GetCurrentSettings()
c.s=ReadRegKey(#HKEY_LOCAL_MACHINE,"Config\0001\Display\Settings","BitsPerPixel")
wh.s=ReadRegKey(#HKEY_LOCAL_MACHINE,"Config\0001\Display\Settings","Resolution")
If c = "4"
co$ = "16 Farben"
ElseIf c = "8"
co$ = "256 Farben"
ElseIf c = "16"
co$ = "HightColor"
ElseIf c = "32"
co$ = "TrueColor"
EndIf
retstring.s = StringField(wh,1,",") + " * " + StringField(wh,2,",") + " - " + co$
ProcedureReturn retstring
EndProcedure
If OpenWindow(0, 100, 200, 295, 80, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "Change Display-Setting")
If CreateGadgetList(WindowID())
CB = CreateWindowEx_($200,"COMBOBOX","",#WS_CHILD|#WS_VISIBLE|#CBS_DROPDOWN|#WS_VSCROLL ,2,10,290,400,WindowID(),100,GetModuleHandle_(0),0)
SendMessage_(CB,#WM_SETFONT,GetStockObject_(#DEFAULT_GUI_FONT),1)
ButtonGadget(1, 2, 44, 290,24,"Change Display")
EndIf
While EnumDisplaySettings_(0,x,dev.DEVMODE)
If dev\dmBitsPerPel = 4
f$ = "16 Farben"
ElseIf dev\dmBitsPerPel = 8
f$ = "256 Farben"
ElseIf dev\dmBitsPerPel = 16
f$ = "HightColor"
ElseIf dev\dmBitsPerPel = 32
f$ = "TrueColor"
EndIf
AddElement(Display())
Display()\dmSize = SizeOf(DEVMODE)
Display()\dmFields = #DM_PELSHEIGHT|#DM_PELSWIDTH|#DM_BITSPERPEL|#DM_DISPLAYFLAGS|#DM_DISPLAYFREQUENCY
Display()\dmBitsPerPel = dev\dmBitsPerPel
Display()\dmPelsWidth = dev\dmPelsWidth
Display()\dmPelsHeight = dev\dmPelsHeight
Display()\dmDisplayFlags = dev\dmDisplayFlags
Display()\dmDisplayFrequency = dev\dmDisplayFrequency
dd$ = Str(dev\dmPelsWidth) + " * " + Str(dev\dmPelsHeight) + " - " + f$
x + 1
SendMessage_(CB,#CB_ADDSTRING,0,dd$)
Wend
SendMessage_(CB,#CB_SETCURSEL,SendMessage_(CB,#CB_FINDSTRING,0,GetCurrentsettings()),0)
InvalidateRect_(WindowID(),0,0)
Repeat
EventID.l = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
If EventID = #PB_EventGadget
Select EventGadgetID()
Case 1
SelectElement(Display(),SendMessage_(CB,#CB_GETCURSEL,0,0))
If Display()\dmBitsPerPel = 4
f$ = "16 Farben"
ElseIf Display()\dmBitsPerPel = 8
f$ = "256 Farben"
ElseIf Display()\dmBitsPerPel = 16
f$ = "HightColor"
ElseIf Display()\dmBitsPerPel = 32
f$ = "TrueColor"
EndIf
d$ = Str(Display()\dmPelsWidth) + " * " + Str(Display()\dmPelsHeight) + " - " + f$
If d$ <> GetCurrentSettings()
If ChangeDisplaySettings_(Display(),#CDS_UPDATEREGISTRY) = #DISP_CHANGE_RESTART
MessageRequester("Meldung","Neustart nötig",64)
EndIf
Else
MessageRequester("Meldung","Nichts zu ändern",64)
EndIf
EndSelect
EndIf
Until Quit = 1
EndIf
End
; ExecutableFormat=Windows
; EnableXP
; EOF
I notice you are using these API commands. Did you know there is a cross platform Desktop library now?Code: Select all
dtw=GetSystemMetrics_(#SM_CXSCREEN) dth=GetSystemMetrics_(#SM_CYSCREEN)
Code: Select all
#DISP_CHANGE_SUCCESSFUL = 0 ; The settings change was successful.
#DISP_CHANGE_RESTART = 1 ; The computer must be restarted in order for the graphics mode to work.
#DISP_CHANGE_BADFLAGS = -4 ; An invalid set of flags was passed in.
#DISP_CHANGE_FAILED = -1 ; The display driver failed the specified graphics mode.
#DISP_CHANGE_BADMODE = -2 ; The graphics mode is not supported.
#DISP_CHANGE_NOTUPDATED = -3 ; Windows NT only: Unable to write settings to the registry.
ProcedureDLL ChangeDisplaySettings(width,height,Depth,Freq,Permanent)
dmScreenSettings.DEVMODE
dmScreenSettings\dmSize = SizeOf(dmScreenSettings)
dmScreenSettings\dmPelsWidth = width
dmScreenSettings\dmPelsHeight = height
dmScreenSettings\dmBitsPerPel = Depth
dmScreenSettings\dmDisplayFrequency=Freq
dmScreenSettings\dmFields = 262144 | 524288 | 1048576
If Permanent
retour=ChangeDisplaySettings_(@dmScreenSettings, 1)
Else
retour=ChangeDisplaySettings_(@dmScreenSettings, 4)
EndIf
ProcedureReturn retour
EndProcedure
;/ Test
ChangeDisplaySettings(1024,768,16,70,0)
MessageRequester("Change Display Settings","OK to Restore")
Code: Select all
ProcedureDLL.s EnumDisplay()
Static b
If b > -1
If EnumDisplaySettings_(0,b,dmEcran.DEVMODE)
retour.s=Str (dmEcran\dmPelsWidth)+","+ Str (dmEcran\dmPelsHeight)+","+ Str (dmEcran\dmBitsPerPel) + ","+Str(dmEcran\dmDisplayFrequency)
Else
b=-2
EndIf
EndIf
b=b+1
ProcedureReturn retour
EndProcedure
;/ Test
x.s=EnumDisplay()
While x<>""
Debug x
x.s=EnumDisplay()
Wend