Moi!
Tästä onkin monet puhunut jo, mutta en ole löytänyt sopivia vastauksia edes Googlella.
Miten siis vaihdetaan resoluutio ja näyttötila + muita näytön asetuksia WinAPIlla?
Olen yrittänyt seuraavaa koodia:
Public Structure DEVMODE
<System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Dim dmDeviceName As String
Dim dmSpecVersion As Short
Dim dmDriverVersion As Short
Dim dmSize As Short
Dim dmDriverExtra As Short
Dim dmFields As Integer
Dim dmOrientation As Short
Dim dmPaperSize As Short
Dim dmPaperLength As Short
Dim dmPaperWidth As Short
Dim dmScale As Short
Dim dmCopies As Short
Dim dmDefaultSource As Short
Dim dmPrintQuality As Short
Dim dmColor As Short
Dim dmDuplex As Short
Dim dmYResolution As Short
Dim dmTTOption As Short
Dim dmCollate As Short
<System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Dim dmFormName As String
Dim dmUnusedPadding As Short
Dim dmBitsPerPel As Short
Dim dmPelsWidth As Integer
Dim dmPelsHeight As Integer
Dim dmDisplayFlags As Short
Dim dmDisplayFrequency As Long
End Structure
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" (lpDevMode As DEVMODE, ByVal dwFlags As Integer) As Integer
'seuraava koodi on yhdessä aliohjelmassa:
Try
Call EnumDisplaySettings(0&, -1&, DevOrg)
Dim DevNew As DEVMODE = DevOrg
DevNew.dmPelsWidth = 640
DevNew.dmPelsHeight = 480
DevNew.dmBitsPerPel = 16
DevNew.dmDisplayFrequency = 75
Dim test As Long
test = ChangeDisplaySettings(DevNew, &H4) 'tällä rivillä tökkää
Select Case test
Case 0
Call ChangeDisplaySettings(DevNew, &H1)
'näytön asetukset vaihdettu
Case Else
'näytön asetuksia ei vaihdettu
End Select
Catch ex As Exception
MsgBox(ex.Message, 16, "Error!")
End TryMinulla on kyllä koodi, millä palautan asetukset.
Missähän päin on ongelma? Itse epäilen tuota DevMode-struktia (ainakin tällä hetkellä tulee dmPelsWidth:iin ja dmPelsHeight:iin oikeat arvot).
Höpö höpö ErroR++!
Samassa kohassa tökkää. Kumpikaan ei toiminut.
Onko noi 640x480x16bpp @75Hz yleisesti tuettu näyttötila, eli saatko saman suoraan windowsin näyttöasetuksista käyttöön?
Minkä virheen se heittää kun tökkää?
Ei heitä mitään virhettä, vaan tkkäää vaan eli kun koodi saapuu sille riville, ohjelman suoritus vain jatkuu eli aivan kun se olisi hypännyt yllättäen tapahtumakäsittelijästä pois.
Lisäys: *tökkää
Moi taas ErroR++!
Oletko debugannut rivi riviltä ja katsonut mikä jää suorittamatta?
(jos visual studio käytössä, niin heitä breakpoint alkuun ja painele F10:llä eteenpäin)
Olen debugannut rivi riviltä ja tökkää just sillä rivillä.
Kokeileppa seuraavaa, jos structistasi pitää luoda uusi instanssi ennen asetusta.
Dim DevNew As New DEVMODE() DevNew = DevOrg
Oletko tarkistanut myös että sisältääkö structisi DevOrg mitään sisällään?
Strukti sisältää suurinpiirtein kaikki oikeat tiedot.
Mutta tuo DispaySetting toimii! Kiitos! Ainut harmi on se, että maksimoitujen ikkunoiden koko muuttuu aika epämukavasti.
Lisäys: Juu en lähe enää näytön asetuksia vaihtamaan. Sovelsin tota ittelleni ja kuinka ollakkaan, kun testasin sitä niin ei se alussa vaihtanut niitä asetuksia. Sitten taas kun ne piti vaihtaa takasin, se vaihtokin 320 x 200-resoluution. Ei ollut kivaa :(
Ohjelman alussa tallenna nykyinen resoluutiosi, ja ohjelman päätyttyä vaihda takaisin alkuperäiseen.
Niinhän minä yritin tehdä, mutta kutsuin EnumDisplaySettingsiä niin, että iModeNum oli 1 tai 0 (en oikein muista kumpi). Eli se haki pienimmän resoluution mikä vain on tuettu. Värisyvyyskin oli aika inhottava, 8 bittiä eli 256 väriä.
Nyt kyllä enemmän haiskahtaa enemmän siltä että tuo sun resoluutionvaihto on tehty väärin. tuohon on valmiita kirjastojakin olemassa, käytä vaikka niitä jos on ongelmia.
Itse testasin tällä valmiilla koodinpätkällä: http://dotnet.mvps.org/dotnet/faqs/?id=setscreenresolution&lang=en
ja tuo toimi ainakin ihan hyvin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.