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 Try
Minulla 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.