为什么我在win32API中找不到ChangeDisplaySettings?怪事!!!
请指教

解决方案 »

  1.   

    这个在API Text Viewer里面没有: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 TypePrivate Declare Function ChangeDisplaySettings Lib "user32" _
        Alias "ChangeDisplaySettingsA" _
        (lpDevMode As Any, ByVal dwFlags As Long) As Long
      

  2.   

    ?lpDevMode
    Pointer to a DEVMODE structure that describes the graphics mode to switch to. The dmSize member must be initialized to the size, in bytes, of the DEVMODE structure. The following fields in the DEVMODE structure are used:
    dmBitsPerPel
     Bits per pixel
    dmPelsWidth
     Pixel width
    dmPelsHeight
     Pixel height
    dmDisplayFlags
     Mode flags
    dmDisplayFrequency
     Mode frequencyIn addition to setting a value in one or more of the preceding DEVMODE members, you must also set the appropriate flags in the dmFields member. The flags indicate which members of the DEVMODE structure are used for the display settings change. If the appropriate bit is not set in dmFields, the display setting will not be changed. Set one or more of the following flags:
    DM_BITSPERPEL
     Use the dmBitsPerPel value.
    DM_PELSWIDTH
     Use the dmPelsWidth value.
    DM_PELSHEIGHT
     Use the dmPelsHeight value.
    DM_DISPLAYFLAGS
     Use the dmDisplayFlags value.
    DM_DISPLAYFREQENCY
     Use the dmDisplayFrequency value.If lpDevMode is NULL, all the values currently in the registry will be used for the display setting. Passing NULL for the lpDevMode parameter is the easiest way to return to the default mode after a dynamic mode change.?dwflags
    Indicates how the graphics mode should be changed. May be one of the following:
    0
     The graphics mode for the current screen will be changed dynamically.
    CDS_UPDATEREGISTRY
     The graphics mode for the current screen will be changed dynamically and the graphics mode will be updated in the registry. The mode information is stored in the USER profile.
    CDS_TEST
     The system tests if the requested graphics mode could be set.If CDS_UPDATEREGISTRY is specified and it is possible to change the graphics mode dynamically, the information is stored in the registry and DISP_CHANGE_SUCCESSFUL is returned. If it is not possible to change the graphics mode dynamically, the information is stored in the registry and DISP_CHANGE_RESTART is returned.
    Windows NT: If the information could not be stored in the registry, the graphics mode is not changed and DISP_CHANGE_NOTUPDATED is returned.
    Specifying CDS_TEST allows an application to determine which graphics modes are actually valid, without causing the system to change to that graphics mode.
      

  3.   

    'Change Resolution
    Option Explicit
    Const WM_DISPLAYCHANGE = &H7E
    Const HWND_BROADCAST = &HFFFF&
    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
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) 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, ScInfo As Long, erg As Long, an As VbMsgBoxResult
        'Get the info into DevM
        erg = EnumDisplaySettings(0&, 0&, DevM)
        'This is what we're going to change
        DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
        DevM.dmPelsWidth = X 'ScreenWidth
        DevM.dmPelsHeight = Y 'ScreenHeight
        DevM.dmBitsPerPel = Bits '(can be 8, 16, 24, 32 or even 4)
        'Now change the display and check if possible
        erg = ChangeDisplaySettings(DevM, CDS_TEST)
        'Check if succesfull
        Select Case erg&
            Case DISP_CHANGE_RESTART
                an = MsgBox("You've to reboot", vbYesNo + vbSystemModal, "Info")
                If an = vbYes Then
                    erg& = ExitWindowsEx(EWX_REBOOT, 0&)
                End If
            Case DISP_CHANGE_SUCCESSFUL
                erg = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
                ScInfo = Y * 2 ^ 16 + X
                'Notify all the windows of the screen resolution change
                SendMessage HWND_BROADCAST, WM_DISPLAYCHANGE, ByVal Bits, ByVal ScInfo
                MsgBox "Everything's ok", vbOKOnly + vbSystemModal, "It worked!"
            Case Else
                MsgBox "Mode not supported", vbOKOnly + vbSystemModal, "Error"
        End Select
    End Sub
    Private Sub Form_Load()
        'KPD-Team 1999
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim nDC As Long
        'retrieve the screen's resolution
        OldX = Screen.Width / Screen.TwipsPerPixelX
        OldY = Screen.Height / Screen.TwipsPerPixelY
        'Create a device context, compatible with the screen
        nDC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)
        'Change the screen's resolution
        ChangeRes 640, 480, GetDeviceCaps(nDC, BITSPIXEL)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'restore the screen resolution
        ChangeRes OldX, OldY, GetDeviceCaps(nDC, BITSPIXEL)
        'delete our device context
        DeleteDC nDC
    End Sub
      

  4.   

    是不是不楼上的Type拷贝了就能用了?