Avatar billede orca Nybegynder
06. september 2002 - 21:04 Der er 2 kommentarer og
1 løsning

Ændring af skærmopløsning

Hej alle. Jeg prøver på at ændre brugerens skærmopløsning, og jeg er kommet frem til denne kode:

Module Module1

    Sub Main()
        ChangeRes(1024, 768)
    End Sub

    Private Const CCDEVICENAME = 32
    Private Const CCFORMNAME = 32
    Private Const DM_PELSWIDTH = &H80000
    Private Const DM_PELSHEIGHT = &H100000

    Private Declare Function EnumDisplaySettings Lib "user32" _
        Alias "EnumDisplaySettingsA" _
        (ByVal lpszDeviceName As Long, _
        ByVal iModeNum As Long, _
    ByVal lpDevMode As Object) As Boolean

    Private Declare Function ChangeDisplaySettings Lib "user32" _
        Alias "ChangeDisplaySettingsA" _
        (ByVal lpDevMode As Object, _
        ByVal dwflags As Long) As Long

    Private Structure DEVMODE
        Public dmDeviceName As String '* CCDEVICENAME
        Public dmSpecVersion As Integer
        Public dmDriverVersion As Integer
        Public dmSize As Integer
        Public dmDriverExtra As Integer
        Public dmFields As Long
        Public dmOrientation As Integer
        Public dmPaperSize As Integer
        Public dmPaperLength As Integer
        Public dmPaperWidth As Integer
        Public dmScale As Integer
        Public dmCopies As Integer
        Public dmDefaultSource As Integer
        Public dmPrintQuality As Integer
        Public dmColor As Integer
        Public dmDuplex As Integer
        Public dmYResolution As Integer
        Public dmTTOption As Integer
        Public dmCollate As Integer
        Public dmFormName As String '* CCFORMNAME
        Public dmUnusedPadding As Integer
        Public dmBitsPerPel As Integer
        Public dmPelsWidth As Long
        Public dmPelsHeight As Long
        Public dmDisplayFlags As Long
        Public dmDisplayFrequency As Long
    End Structure

    Private Sub ChangeRes(ByVal iWidth As Single, ByVal iHeight As Single)
        Dim blnWorked As Boolean
        Dim i As Long
        Dim DevM As DEVMODE

        i = 0

        Do
            blnWorked = EnumDisplaySettings(0&, i, DevM)
            i = i + 1
        Loop Until (blnWorked = False)

        With DevM
            .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
            .dmPelsWidth = iWidth
            .dmPelsHeight = iHeight
        End With

        Call ChangeDisplaySettings(DevM, 0)
    End Sub

End Module



Men den brokker sig over denne del:

        Do
            blnWorked = EnumDisplaySettings(0&, i, DevM)
            i = i + 1
        Loop Until (blnWorked = False)

Gør jeg noget galt? Er der en indbygget funktion til at ændre opløsning?

Mvh Mark
--
www.improve.dk
Avatar billede jakobandersen Nybegynder
07. september 2002 - 00:27 #1
Hejsa Mark

Der findes ikke i .NET nogle indbyggede metoder til at ændre opløsning på så du skal ganske rigtigt som du selv er i færd med lave nogle API kald. Dog ligner din kode noget VB6 lige pt :-)

Jeg har tidligere skrevet denne stump kode til at lege lidt med opløsningen i .NET, men husk at det er ikke særlig brugervenligt pludselig at skifte brugerens opløsning uden dennes viden!

using Screen;
using System.Runtime.InteropServices;
public class Resolution{
    private DEVMODE dm = new DEVMODE();
    private bool ChangeResolution(int hRes, int vRes) {
        dm.dmSize = (short)Marshal.SizeOf(dm);
        Display.EnumDisplaySettings(null,Display.ENUM_CURRENT_SETTINGS, ref dm);
        dm.dmPelsHeight = vRes;
        dm.dmPelsWidth = hRes;
        int returnVal = Display.ChangeDisplaySettings(ref dm, Display.CDS_TEST);
        if (returnVal == Display.DISP_CHANGE_FAILED) {
            return false;
        }else{
            returnVal = Display.ChangeDisplaySettings(ref dm, Display.CDS_UPDATEREGISTRY);
            if( returnVal == Display.DISP_CHANGE_SUCCESSFUL ){
                return true;
            }else{
                return false;
            }
        }
    }
    public Resolution(int hRes, int vRes){
        ChangeResolution( hRes, vRes );
    }
    public static void Main() {
        Resolution r = new Resolution(800,600);
    }
}

namespace Screen {
    using System.Runtime.InteropServices;
    public struct DEVMODE {
        [MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]
        public string dmDeviceName;
        public short  dmSpecVersion;
        public short  dmDriverVersion;
        public short  dmSize;
        public short  dmDriverExtra;
        public int    dmFields;
        public short  dmOrientation;
        public short  dmPaperSize;
        public short  dmPaperLength;
        public short  dmPaperWidth;
        public short  dmScale;
        public short  dmCopies;
        public short  dmDefaultSource;
        public short  dmPrintQuality;
        public short  dmColor;
        public short  dmDuplex;
        public short  dmYResolution;
        public short  dmTTOption;
        public short  dmCollate;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string dmFormName;
        public short dmUnusedPadding;
        public short dmBitsPerPel;
        public int dmPelsWidth;
        public int dmPelsHeight;
        public int dmDisplayFlags;
        public int dmDisplayFrequency;
    };
    public class Display {
        [DllImport("user32.dll")]
        public static extern int EnumDisplaySettings( string deviceName, int modeNum, ref DEVMODE devMode );
       
        [DllImport("user32.dll")]
        public static extern int ChangeDisplaySettings(ref DEVMODE devMode, int flags);
       
        public const int ENUM_CURRENT_SETTINGS = -1;
        public const int CDS_UPDATEREGISTRY = 0x01;
        public const int CDS_TEST = 0x02;
        public const int DISP_CHANGE_SUCCESSFUL = 0;
        public const int DISP_CHANGE_FAILED = -1;
    }
}

Du må selv lige oversætte til VB eller lære at bruge et rigtigt sprog :-)
Avatar billede orca Nybegynder
07. september 2002 - 01:15 #2
Hej duck.

Tak for koden! Ang valg af sprog... heh, C# Vs. VB... tjae.

Og forresten, du har ret i at det er VB6, jeg har bare prøvet at oversætte det... dog uden videre held :)

Mvh Mark
--
www.improve.dk
Avatar billede orca Nybegynder
07. september 2002 - 01:30 #3
I Visual Studio, hvordan vælger jeg da at lave et nyt projekt, med C# som kildekode? Jeg har installeret support for C#.

Mvh Mark
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester