Newsgroup: it.comp.lang.visual-basic
Titolo: Procedura per Setup video

E' possibile modificare le impostazioni video del sistema operativo,
almeno win98, attraveso un modulo VB? Tenendo conto che forse e'
necessario un riavvio del PC,  ecc.?
Mi interessa una procedura che modifichi la risoluzione da quella
attuale a 16 colori e viceversa.
Grazie.

Ti consiglio una cosa viste i driver incasinati di ogni scheda video :
MsgBox ("Si prega di impostare a 16 il numero di colori")
Hahahahaha.
Beh, era una battuta, comunque mi sa che impazzirai e che una volta trovata
la soluzione, non funzionerà su tutti i sistemi.
Dipende molto dai diversi driver che hanno le schede video.
In teoria dovresti rilevare la scheda video, e per ognuna conosciuta, usare
una funzione diversa.
Neanche le grandi case di software ci sono mai riuscite, figuriamoci un
privato!
Di solito anche i giochi che necessitano di un certo numero di colori, usano
la tecnica della message box come ti ho spiegato, hehehe.
Ciao

Questa procedura utilizza le API di Windows:
attiva una risoluzione  per il programma, e all'uscita
ritorna alla precedente.
Forse è quella che fa al caso tuo
Buon lavoro
Bye
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const CCDEVICENAME = 32
Const CCFORMNAME = 32
Const DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H4
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1
Const BITSPIXEL = 12
Private Type DEVMODE
    dmDeviceName As String * CCDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type
Private Declare Function EnumDisplaySettings Lib "user32" Alias
"EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As
Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias
"ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long,
ByVal dwReserved As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal
nIndex As Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal
lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As
String, ByVal lpInitData As Any) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Dim OldX As Long, OldY As Long, nDC As Long
Sub ChangeRes(X As Long, Y As Long, Bits As Long)
    Dim DevM As DEVMODE
    'Ritorna il valore corrente di DevM
    erg& = EnumDisplaySettings(0&, 0&, DevM)
    DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
    DevM.dmPelsWidth = X 'ScreenWidth
    DevM.dmPelsHeight = Y 'ScreenHeight
    DevM.dmBitsPerPel = Bits '(puo essere  8, 16, 24, 32 )
    'Ora cambia la risoluzione e controlla che sia possibile
    erg& = ChangeDisplaySettings(DevM, CDS_TEST)
    'Controlla l'esitol
    Select Case erg&
        Case DISP_CHANGE_RESTART
            an = MsgBox("Riavviare il sistema", vbYesNo + vbSystemModal,
"Info")
            If an = vbYes Then
                erg& = ExitWindowsEx(EWX_REBOOT, 0&)
            End If
        Case DISP_CHANGE_SUCCESSFUL
            erg& = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
            MsgBox "Cambio risoluzione ok", vbOKOnly + vbSystemModal, "It
worked!"
        Case Else
            MsgBox "Modalità non supportata", vbOKOnly + vbSystemModal,
"Error"
    End Select
End Sub
Private Sub Form_Load()
    Dim nDC As Long
    OldX = Screen.Width / Screen.TwipsPerPixelX
    OldY = Screen.Height / Screen.TwipsPerPixelY
    nDC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)
    ChangeRes 640, 480, GetDeviceCaps(nDC, BITSPIXEL)     '  Questi sono i
comandi per il cambio di risoluzione
End Sub
Private Sub Form_Unload(Cancel As Integer)
    ChangeRes OldX, OldY, GetDeviceCaps(nDC, BITSPIXEL)  ' ritorna alla
risoluzione precedente
    DeleteDC nDC
End Sub

la tecnica della message box come ti ho spiegato, hehehe.
E secondo te, quando te con le tue manine specifichi una nuova risoluzione
con un altro numero di colori, chi č che compie la modifica? Il fantasma di
Claudio Bona? (vedi "I N C R E D I B I L E")
No birimbo, č una serie di API, e cioč quelle che ha postato l'amico Nunzio
Barletta.