#1
  1. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Aug 2006
    Posts
    31
    Rep Power
    12

    Setting Primary Display


    Hi,
    I'm trying to set the Primary Display...without success!
    Here's the code I'm working on, would you please help me see what I'm doing wrong there?
    There's no compilation error...it simply doesn't give the expected result!
    Thank you!!

    Code:
    Imports System.Runtime.InteropServices
    Class MainWindow
        Const CCDEVICENAME As Short = 32
        Const CCFORMNAME As Short = 32
     
        Private Const MONITORINFOF_PRIMARY As Integer = &H1
        Private Const DISPLAY_DEVICE_ATTACHED_TO_DESKTOP As Integer = &H1
        Private Const DISPLAY_DEVICE_PRIMARY_DEVICE As Integer = &H4
        Private Const DISPLAY_DEVICE_MIRRORING_DRIVER As Integer = &H8
        Private Const DISPLAY_DEVICE_VGA_COMPATIBLE As Integer = &H10
        Private Const DISPLAY_DEVICE_REMOVABLE As Integer = &H20
        Private Const DISPLAY_DEVICE_MODESPRUNED As Integer = &H8000000
     
        Private Const DM_POSITION = &H20
        Private Const DM_DISPLAYORIENTATION = &H80 ' XP only
        Private Const DM_BITSPERPEL = &H40000
        Private Const DM_PELSWIDTH = &H80000
        Private Const DM_PELSHEIGHT = &H100000
        Private Const DM_DISPLAYFLAGS = &H200000
        Private Const DM_DISPLAYFREQUENCY = &H400000
        'Private Const DM_DISPLAYFIXEDOUTPUT As Long = &H20000000 ' XP only
     
        Private Const ENUM_CURRENT_SETTINGS As Integer = -1
        Private Const ENUM_REGISTRY_SETTINGS As Integer = -2
        Private Const EDS_RAWMODE As Integer = &H2
     
        Private Const CDS_UPDATEREGISTRY As Integer = &H1
        Private Const CDS_TEST As Integer = &H2
        Private Const CDS_FULLSCREEN As Integer = &H4
        Private Const CDS_GLOBAL As Integer = &H8
        Private Const CDS_SET_PRIMARY As Integer = &H10
        Private Const CDS_VIDEOPARAMETERS As Integer = &H20
        Private Const CDS_NORESET As Integer = &H10000000
        Private Const CDS_RESET As Integer = &H40000000
        Private Const CDS_FORCE As Integer = &H80000000
        Private Const CDS_NONE As Integer = 0
     
        Public Structure PointL
            Dim x As Integer
            Dim y As Integer
        End Structure
     
        <Flags()> _
        Enum DisplayDeviceStateFlags As Integer
            AttachedToDesktop = &H1
            MultiDriver = &H2
            PrimaryDevice = &H4
            MirroringDriver = &H8
            VGACompatible = &H10
            Removable = &H20
            ModesPruned = &H8000000
            Remote = &H4000000
            Disconnect = &H2000000
        End Enum
     
        '0 is Not Attached
     
        Const DISPLAY_PRIMARY_DEVICE = &H4 'Primary device
     
        'Holds the information of display adpter
        Private Structure DISPLAY_DEVICE
            Public cb As Integer
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> Public DeviceName As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceString As String
            Public StateFlags As Short
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceID As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceKey As String
        End Structure
     
        'Holds the setting of display adapter
        Private Structure DEVMODE
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> _
            Public dmDeviceName As String
            Public dmSpecVersion As Short
            Public dmDriverVersion As Short
            Public dmSize As Short
            Public dmDriverExtra As Short
            Public dmFields As Integer
            Public dmOrientation As Short
            'Public dmPaperSize As Short
            'Public dmPaperLength As Short
            'Public dmPaperWidth As Short
            'Public dmScale As Short
            Public dmPositionX As Integer
            Public dmPositionY As Integer
            Public dmCopies As Short
            Public dmDefaultSource As Short
            Public dmPrintQuality As Short
            Public dmColor As Short
            Public dmDuplex As Short
            Public dmYResolution As Short
            Public dmTTOption As Short
            Public dmCollate As Short
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)> _
            Public dmFormName As String
            Public dmLogPixels As Short
            Public dmBitsPerPel As Short
            Public dmPelsWidth As Integer
            Public dmPelsHeight As Integer
            Public dmDisplayFlags As Integer
            Public dmDisplayFrequency As Integer
            Public dmICMMethod As Integer
            Public dmICMIntent As Integer
            Public dmMediaType As Integer
            Public dmDitherType As Integer
            Public dmReserved1 As Integer
            Public dmReserved2 As Integer
            Public dmPanningWidth As Integer
            Public dmPanningHeight As Integer
            'Public dmPosition As Point
            'Public dmPositionX As Integer
            'Public dmPositionY As Integer
        End Structure
     
        'API declaration set or get display adpter information
        <DllImport("user32.dll")> _
        Private Shared Function EnumDisplayDevices(ByVal Unused As Integer, _
        ByVal iDevNum As Short, ByRef lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Integer) As Integer
        End Function
     
        <DllImport("user32.dll")> _
        Private Shared Function EnumDisplaySettings(ByVal lpszDeviceName As String, _
        ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
        End Function
     
        <DllImport("user32.dll")> _
        Private Shared Function ChangeDisplaySettingsEx(ByVal lpszDeviceName As String, _
        ByRef lpDevMode As DEVMODE, ByVal hWnd As Integer, ByVal dwFlags As Integer, _
        ByVal lParam As Integer) As Integer
        End Function
        <DllImport("user32.dll")> _
        Private Shared Function ChangeDisplaySettingsEx(ByVal lpszDeviceName As String, _
        ByRef lpDevMode As IntPtr, ByVal hWnd As Integer, ByVal dwFlags As Integer, _
        ByVal lParam As Integer) As Integer
        End Function
     
    Public Sub SetAsPrimaryMonitor(id As UInteger)
            Dim device = New DISPLAY_DEVICE()
            Dim deviceMode = New DEVMODE()
            device.cb = Marshal.SizeOf(device)
     
            EnumDisplayDevices(Nothing, id, device, 0)
            EnumDisplaySettings(device.DeviceName, -1, deviceMode)
            Dim offsetx = deviceMode.dmPositionX
            Dim offsety = deviceMode.dmPositionY
            deviceMode.dmPositionX = 0
            deviceMode.dmPositionY = 0
     
            ChangeDisplaySettingsEx(device.DeviceName, deviceMode, 0, (CDS_SET_PRIMARY Or CDS_UPDATEREGISTRY Or CDS_NORESET), 0)
     
            device = New DISPLAY_DEVICE()
            device.cb = Marshal.SizeOf(device)
     
            ' Update remaining devices
            Dim otherid As UInteger = 0
            While EnumDisplayDevices(Nothing, otherid, device, 0)
     
                If device.StateFlags = DisplayDeviceStateFlags.AttachedToDesktop AndAlso otherid <> id Then
                    device.cb = Marshal.SizeOf(device)
                    Dim otherDeviceMode = New DEVMODE()
     
                    EnumDisplaySettings(device.DeviceName, -1, otherDeviceMode)
     
                    otherDeviceMode.dmPositionX -= offsetx
                    otherDeviceMode.dmPositionY -= offsety
     
                    ChangeDisplaySettingsEx(device.DeviceName, otherDeviceMode, 0, (CDS_UPDATEREGISTRY Or CDS_NORESET), 0)
                End If
     
                device.cb = Marshal.SizeOf(device)
                otherid += 1
            End While
     
            ' Apply settings
            ChangeDisplaySettingsEx(Nothing, 0, 0, CDS_NONE, 0)
        End Sub
     
        Private Sub Button1_Click_1(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
            SetAsPrimaryMonitor(0)
        End Sub
    End Class
  2. #2
  3. No Profile Picture
    Grumpier old Moderator
    Devshed Supreme Being (6500+ posts)

    Join Date
    Jun 2003
    Posts
    14,553
    Rep Power
    4549
    I have no clue, sorry. Hopefully someone that has some experience with vb.net will jump in.
    ======
    Doug G
    ======
    I've never been able to appreciate the sublime arrogance of folks who feel they were put on earth just to save other folks from themselves .." - Donald Hamilton

IMN logo majestic logo threadwatch logo seochat tools logo