PDA

View Full Version : تغيير رزوليشن



XMEGAMAHDI
چهارشنبه 25 دی 1387, 15:44 عصر
به نام خدا سالم دوستان ميخواستم چطور ميشه در برنامه رزوليشن نمايشگر را خواند يا تغيير داد چون ممكنه در كامپيوتر طرف مقابلم قسمتي از فرم پنهان بمونه(ميخواهم همه صفحه ام را نشون بده) متشككرم خداحافظ

mostafaaa
چهارشنبه 25 دی 1387, 17:57 عصر
سلام دوست من
میتونی از این کلاس استفاده کنی ، برای ویندوز ویستا درست کار نمیکنه ولی توی xp مشکلی نداره.

Imports System.Runtime.InteropServices
Public Class resChanger
Const ENUM_CURRENT_SETTINGS As Integer = -1
Const CDS_UPDATEREGISTRY As Integer = &H1
Const CDS_TEST As Long = &H2

Const CCDEVICENAME As Integer = 32
Const CCFORMNAME As Integer = 32

Const DISP_CHANGE_SUCCESSFUL As Integer = 0
Const DISP_CHANGE_RESTART As Integer = 1
Const DISP_CHANGE_FAILED As Integer = -1

Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef DEVMODE As DEVMODE, ByVal flags As Long) As Integer

<StructLayout(LayoutKind.Sequential)> Public Structure DEVMODE
<MarshalAsAttribute(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 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
<MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)> Public dmFormName As String
Public dmUnusedPadding As Short
Public dmBitsPerPel As Short
Public dmPelsWidth As Integer
Public dmPelsHeight As Integer
Public dmDisplayFlags As Integer
Public dmDisplayFrequency As Integer
End Structure

Public Sub changeRes(ByVal theWidth As Integer, ByVal theHeight As Integer)

Dim DevM As DEVMODE

DevM.dmDeviceName = New [String](New Char(32) {})
DevM.dmFormName = New [String](New Char(32) {})
DevM.dmSize = CShort(Marshal.SizeOf(GetType(DEVMODE)))


If 0 <> EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, DevM) Then
Dim lResult As Integer

DevM.dmPelsWidth = theWidth
DevM.dmPelsHeight = theHeight
DevM.dmPelsWidth = 1280
DevM.dmPelsHeight = 1024

lResult = ChangeDisplaySettings(DevM, CDS_TEST)

If lResult = DISP_CHANGE_FAILED Then
MsgBox("Display Change Failed.", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Screen Resolution Change Failed")
Else

lResult = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)

Select Case lResult
Case DISP_CHANGE_RESTART
MsgBox("You must restart your computer to apply these changes.", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Screen Resolution Has Changed")
Case DISP_CHANGE_SUCCESSFUL
MsgBox("Display Change Successful.", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Screen Resolution Successful")
Case Else
MsgBox("Display Change Failed.", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "Screen Resolution Change Failed")
End Select
End If


End If
End Sub

End Class

abi_sarab
پنج شنبه 26 دی 1387, 10:40 صبح
آقا مصطفی مرسی!
شما همیشه راه حلهای مفیدی ارائه می دید و من از شما متشکرم.
می شه یه نمونه از این رو بذارید خودتون یعنی توی یه برنامه.
کدشم هم بذارید.

mostafaaa
پنج شنبه 26 دی 1387, 11:20 صبح
سلام دوست من
این کلاس یه متد بیشتر نداره که اونم دوتا آرگومان داره که رسلوشن رو میگره به راحتی میتونید یه Instance ازش بگیرید و این متد رو مقدار دهی کنید . برای مثال :

Dim RC As New resChanger
RC.changeRes(1280, 600)

abi_sarab
شنبه 28 دی 1387, 10:39 صبح
آقا مصطفی این فقط یه کار می کنه اونم اینه که می یاد رزولوشن رو به آخرین مد تغییر می ده.
انتخاب نداره.

mostafaaa
شنبه 28 دی 1387, 11:38 صبح
سلام دوست من
متاسفانه این کد روی سیستم خودم که ویستا هستش کار نمیکنه ولی روی سیستم یکی از دوستان که XP بود تستش کردم مشکلی نداشت.
الاایحال سعی میکنم یه کد دیگه واسه این کار پیدا کنم.
یا علی

mostafaaa
شنبه 28 دی 1387, 12:01 عصر
دوباره سلام
این یکی 100% کار میکنه هم تو Vista و هم تو XP .

Imports System.Runtime.InteropServices


<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Friend Structure DEVMODE

<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
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 dmPositionX As Integer
Public dmPositionY As Integer
Public dmDisplayOrientation As Integer
Public dmDisplayFixedOutput As Integer
Public dmColor As Short
Public dmDuplex As Short
Public dmYResolution As Short
Public dmTTOption As Short
Public dmCollate As Short
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
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
End Structure

Friend Class NativeMethods

' PInvoke declaration for EnumDisplaySettings Win32 API
<DllImport("user32.dll", CharSet:=CharSet.Ansi)> _
Public Shared Function EnumDisplaySettings( _
ByVal lpszDeviceName As String, _
ByVal iModeNum As Integer, _
ByRef lpDevMode As DEVMODE) As Integer
End Function

' PInvoke declaration for ChangeDisplaySettings Win32 API
<DllImport("user32.dll", CharSet:=CharSet.Ansi)> _
Public Shared Function ChangeDisplaySettings( _
ByRef lpDevMode As DEVMODE, _
ByVal dwFlags As Integer) As Integer
End Function

End Class

Public Class ResolutionChanger

Private Shared Function CreateDevMode() As DEVMODE
Dim dm As New DEVMODE
dm.dmDeviceName = New String(New Char(32) {})
dm.dmFormName = New String(New Char(32) {})
dm.dmSize = CShort(Marshal.SizeOf(dm))
Return dm
End Function

Public Enum DisplayChangeResultCode
DISP_CHANGE_SUCCESSFUL = 0
DISP_CHANGE_RESTART = 1
DISP_CHANGE_FAILED = -1
DISP_CHANGE_BADMODE = -2
DISP_CHANGE_NOTUPDATED = -3
DISP_CHANGE_BADFLAGS = -4
DISP_CHANGE_BADPARAM = -5
DISP_CHANGE_BADDUALVIEW = -6
End Enum

Public Shared Sub ChangeResolution(ByVal width As Integer, ByVal height As Integer, ByVal freq As Integer)

Const DM_PELSWIDTH As Integer = &H80000
Const DM_PELSHEIGHT As Integer = &H100000
Const DM_DISPLAYFREQUENCY As Integer = &H400000
Const ENUM_CURRENT_SETTINGS As Integer = -1
Dim DevM As DEVMODE = CreateDevMode()
Dim enumResult As Integer
Dim changeResult As DisplayChangeResultCode

DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY

enumResult = NativeMethods.EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, DevM)

DevM.dmPelsWidth = width
DevM.dmPelsHeight = height
DevM.dmDisplayFrequency = freq

changeResult = CType(NativeMethods.ChangeDisplaySettings(DevM, 0), DisplayChangeResultCode)

If changeResult <> DisplayChangeResultCode.DISP_CHANGE_SUCCESSFUL Then
Throw New Exception("Failed to change resolution: " & changeResult.ToString)
End If

End Sub

End Class

nokhodsiah2001
شنبه 28 دی 1387, 15:00 عصر
سلام دوست عزیز

این نمونه رو تست کردم کار می کنه البته بر اساس گفته های دوستان , امتحتنش کن
موفق باشی