Eichhorn Posted September 19, 2013 Share Posted September 19, 2013 Hallo alle zusammen, ich suche für meinen HTPC eine neue GK. Bisher tut eine ATI 4670 ihren Dienst darin. Diese kann aber keine BluRay in 3D wiedergeben. Ansonsten bin ich damit zufrieden. Jetzt dachte ich an eine 6670, aber irgendwie muss zu den neueren GK eine Inkompatibilität mit meinem Board herrschen. Ich nutze Voreinstellungen in Verbindung mit Hotkeys. (Frequenzumschaltung/Auflösungsumschaltung) Und genau die erstellten Voreinstellungen funktionieren bei den neueren Karten nicht. Ich habe da schon alles mögliche probiert, bis hin zum System völlig neu aufsetzten und nur den ATI Treiber installiert. Alles ohne Erfolg. Jetzt wollte ich gern mal eine NVIDIA GK probieren, nur kenne ich mich bei diesen gar nicht aus. Sie soll natürlich mit dem DVBViewer problemlos, ruckelfrei HD wiedergeben können. Wichtig wäre noch, das sie 3D Wiedergabe beherrscht. Ich habe keinen Plan, welche Grafikchips bei NVIDIA das beherrschen. Bitte um eure Empfehlungen! Ich weiß, es ist im TV-Kartenunterforum, aber das passte wohl am besten. Gruß Eichhorn Quote Link to comment
nuts Posted September 19, 2013 Share Posted September 19, 2013 Schaltest du mit dem Plugin hier im Forum die Frequenz um? Weil das würde auch ohne die Hotkeys per winapi funktionieren. Bei Nvidia hab ich leider etwas den Überblick verloren. Würde eine kleine Karte mit 128er Speicherinterface der neusten Generation empfehlen. Quote Link to comment
Tüftler Posted September 19, 2013 Share Posted September 19, 2013 Jo eine genauere Fehlerbeschreibung wäre nicht schlecht dann könnte man dem Problem auf die schliche kommen. Bei mir funktionierte die Umschaltung mit der 6670 immer gut. Mit der APU mag das aber der LAV Decoder nicht besonders (BluRay). Quote Link to comment
Eichhorn Posted September 20, 2013 Author Share Posted September 20, 2013 Danke erst einmal für die Antworten. Um diesen Fehler näher zu erklären (was ich auch schon alles probiert habe) muss ich etwas mehr schreiben. In meinem System arbeitet eine 4670 von HIS auf einem älteren Board von GIGABYTE (GA-G31MX-S2). Alles funktioniert soweit bestens. Zur Auflösungsumschaltung habe ich mir 3 Profile im CCC angelegt. (720p, 1080p und 1080p/24) 720p nutze ich, wenn ich mal was im Internet suche oder sonstiges am PC mache, 1080p normal für DVBViewer und 1080p/24 für BluRay mittels TMT5. Jedes Profil hat einen Hotkey (Strg.+Shift+1) 2 und 3 natürlich. Jetzt habe ich mit AutoIT 3 exe Dateien gebastelt, welche beim Anklicken den jeweiligen benötigten Hotkey auslösen. Diese steuere ich entweder mit einer Taste auf der FB oder automatisch durch ein weiteres Script z.B. beim Starten von TMT5 und beim Beenden von TMT5 wird wieder auf 50Hz geschaltet. Klappt mit der 4670 alles wunderbar. Jetzt gehen die Probleme los. (ich hatte den GK Wechsel übrigen vor einem Jahr auch schon mal probiert damals auch eine 6670 und eine 7750 beide gleiches Ergebnis) Nach dem Wechsel der GK konnte ich soweit das CCC usw. einwandfrei installieren. Auch die Einstellungen klappen soweit einwandfrei. Ich kann im CCC auch Profile (nennt sich dort Voreinstellungen) neu anlegen. Bei einem Anklicken des jeweiligen Profils, egal ob mit der Maus auf das Profil oder per Hotkey passiert nichts. D.h. gar nichts kann man so nicht sagen, man kann im Profil ja auch noch eine Anwendung auswählen, welche bei der Aktivierung automatisch gestartet wird. (zum Test notpad.exe) Wenn ich dieses Profil jetzt aktiviere, dann startet die notpad.exe, aber die Auflösung wird nicht umgeschaltet. Um andere Fehlerquellen auszuschließen, hatte ich bei meinem ersten Versuch (voriges Jahr) mal Windows7 komplett neu aufgesetzt und nur den GK Treiber installiert. Auch da klappte es schon nicht. Es kann sich doch da nur um irgend eine Hardwareinkompalibilität handeln? Gruß Eichhorn Quote Link to comment
nuts Posted September 20, 2013 Share Posted September 20, 2013 (edited) Für die Umschaltung der Auflösung und/oder der Frequenz habe ich eine fertige Funktion per winapi in autoit.Ist hier im includes Download enthalten: http://www.DVBViewer.tv/forum/topic/48512-erweitertes-beenden-v2-extended-exit-v2/ ( myscripts_functions_2.au3 => _ScreenSetting ) Edited September 20, 2013 by nuts Quote Link to comment
Eichhorn Posted September 20, 2013 Author Share Posted September 20, 2013 Da muss ich gestehen, dass ist mir zu kompliziert. Das begreife ich nicht so recht. Quote Link to comment
nuts Posted September 20, 2013 Share Posted September 20, 2013 (edited) #include <WindowsConstants.au3> Global Const $DISP_CHANGE_SUCCESSFUL = 0 global Const $DISP_CHANGE_RESTART = 1 ;"Restart your computer for change display settings" global Const $DISP_CHANGE_FAILED = -1 ;"The video driver not set a new mode" global Const $DISP_CHANGE_BADMODE = -2 ;"Video mode not supported" global Const $DISP_CHANGE_NOTUPDATED = -3 ;"Video mode not supported" global Const $DISP_CHANGE_BADFLAGS = -4 ;"Bad flags" global Const $DISP_CHANGE_BADPARAM = -5 ;"Bad parameters" global Const $CDS_TEST = 0x4 global Const $CDS_UPDATEREGISTRY = 0x1 global Const $DM_PELSWIDTH = 0x80000 global Const $DM_PELSHEIGHT = 0x100000 global Const $DM_BITSPERPEL = 0x40000 global Const $DM_DISPLAYFREQUENCY = 0x400000 global Const $ENUM_CURRENT_SETTINGS = -1 global Const $HWND_BROADCAST = 0xFFFF global Const $SPI_SETNONCLIENTMETRICS = 0x2A _ScreenSetting(1920, 1080, @DesktopDepth, 50) ; => 1080p50 _ScreenSetting(1920, 1080, @DesktopDepth, 24) ; => 1080p24 _ScreenSetting(1920, 1080, @DesktopDepth, 23) ; => 1080p23 _ScreenSetting(1280, 720, @DesktopDepth, 60) ; => 720p60 ;==================================================================================== ; ;Function Name: _ScreenSetting() ;Description: Changes the screen resolution, color dept and refresh rate ;Version: 1.0 ;Parameters: $iWidth - Width of the desktop screen in pixels. (horizontal resolution) ; $iHeight - Height of the desktop screen in pixels. (vertical resolution) ; $iDepth - Depth of the desktop screen in bits per pixel. ; $iRefresh - Refresh rate of the desktop screen in hertz. ;Return Value(s): On Success - Screen is adjusted ; On failure - Message with error description ;Requirement(s): Tested on AutoIt 3.2.10.0 ;Autor(s): R.Gilman (a.k.a rasim); special thanks to amel27 ; modified: nuts (www.autoit.de) ;==================================================================================== Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh) Local $reterror = False Local $DEVMODE, $DllRet $DEVMODE = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _ "ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _ "short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _ "short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _ "byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _ "dword dmDisplayFlags;dword dmDisplayFrequency") $DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _ "ptr", DllStructGetPtr($DEVMODE)) $DllRet = $DllRet[0] If $DllRet = 0 Then $reterror = "Unable to get graphic mode" SetError(1, 0, 0) Return $reterror EndIf $VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0") $VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM") RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0) DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE)) DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth) DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight) DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth) DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh) DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY)) $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST) ; hier wird geprüft ob die Änderung angenommen wurde $DllRet = $DllRet[0] If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then ;Auswertung $reterror = "Error: _ScreenSetting: " & $DllRet EndIf $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY) ;hier wird die Änderung dann durchgeführt $DllRet = $DllRet[0] DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _ "int", $SPI_SETNONCLIENTMETRICS, "int", 0) ;abfeuern der WM_DISPLAYCHANGE Nachricht (Auswirkungen unklar ) RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1) $DEVMODE = "" $DllRet = "" Return $reterror EndFunc ;==>_ScreenSetting Edited September 20, 2013 by nuts Quote Link to comment
Tüftler Posted September 20, 2013 Share Posted September 20, 2013 Das Problem im CCC ist folgendes:Ein angelegtes Profil merkt sich das Mistding bei einem Neustart des Systems.Bedeutet: Einstellungen vornehmen, Profil anlegen, Rechner neustarten.Das machst du 3x, also für jedes Profil. Anschließend sollte das gehen.Wenn du bereits Profile benannt hast nimm lieber neue Namen, die werden nicht richtig überschrieben.Wenn du für alle Wiedergabearten den DVBViewer verwendest brauchst du das nicht, dann nimm das >Plugin< von SnoopyDog. Quote Link to comment
Eichhorn Posted September 20, 2013 Author Share Posted September 20, 2013 Bei dem Script verstehe ich leider nur Bahnhof Muss ich die 3au dann mehrfach starten??? @Tüftler Ich nutze zur BluRay Wiedergabe TMT5. Bei der 4670 hat sich das CCC das Profil aber gleich gemerkt. Die 720p Auflösung nutze ich, wenn ich mal irgend was Anderes am PC mache. Wenn ich bei TMT5 auf "automatische Frequenzumschaltung" gehe, dann wird sie beim Starten einer BluRay auch brav auf 24Hz umgeschaltet. Wenn ich aber TMT5 schließe, dann bleibt es bei den 24Hz. Es wäre schön, wenn das dann wieder zurück schalten würde. Das mit dem Neustart werde ich noch einmal probieren. Quote Link to comment
nuts Posted September 20, 2013 Share Posted September 20, 2013 (edited) Bei dem Script verstehe ich leider nur Bahnhof Muss ich die 3au dann mehrfach starten???Du könntest den Aufruf der Funktion in deine schon vorhandenen Skripte einbinden.Anstatt den Hotkey aufzurufen eben z.B. _ScreenSetting(1920, 1080, @DesktopDepth, 50) ; => 1080p50 P.S. Poste doch mal eines deiner Skripte, dann mach ich ein Beispiel. Edited September 20, 2013 by nuts Quote Link to comment
Eichhorn Posted September 20, 2013 Author Share Posted September 20, 2013 (edited) einmal das: $read = IniRead(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 1)Switch $read Case 1 Send("^+{4}") IniWrite(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 2) Case 2 Send("^+{2}") IniWrite(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 1)EndSwitch Edited September 20, 2013 by Eichhorn Quote Link to comment
nuts Posted September 20, 2013 Share Posted September 20, 2013 Das erste Skript würde dann so aussehen: #include <WindowsConstants.au3> Global Const $DISP_CHANGE_SUCCESSFUL = 0 global Const $DISP_CHANGE_RESTART = 1 ;"Restart your computer for change display settings" global Const $DISP_CHANGE_FAILED = -1 ;"The video driver not set a new mode" global Const $DISP_CHANGE_BADMODE = -2 ;"Video mode not supported" global Const $DISP_CHANGE_NOTUPDATED = -3 ;"Video mode not supported" global Const $DISP_CHANGE_BADFLAGS = -4 ;"Bad flags" global Const $DISP_CHANGE_BADPARAM = -5 ;"Bad parameters" global Const $CDS_TEST = 0x4 global Const $CDS_UPDATEREGISTRY = 0x1 global Const $DM_PELSWIDTH = 0x80000 global Const $DM_PELSHEIGHT = 0x100000 global Const $DM_BITSPERPEL = 0x40000 global Const $DM_DISPLAYFREQUENCY = 0x400000 global Const $ENUM_CURRENT_SETTINGS = -1 global Const $HWND_BROADCAST = 0xFFFF global Const $SPI_SETNONCLIENTMETRICS = 0x2A $read = IniRead(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 1) Switch $read Case 1 _ScreenSetting(1920, 1080, @DesktopDepth, 24) ;1080p24 ; _ScreenSetting(1920, 1080, @DesktopDepth, 23) ; oder 1080p23 => 23,976hz für Blurays IniWrite(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 2) Case 2 _ScreenSetting(1920, 1080, @DesktopDepth, 50) ;1080p50 IniWrite(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 1) EndSwitch ;==================================================================================== ; ;Function Name: _ScreenSetting() ;Description: Changes the screen resolution, color dept and refresh rate ;Version: 1.0 ;Parameters: $iWidth - Width of the desktop screen in pixels. (horizontal resolution) ; $iHeight - Height of the desktop screen in pixels. (vertical resolution) ; $iDepth - Depth of the desktop screen in bits per pixel. ; $iRefresh - Refresh rate of the desktop screen in hertz. ;Return Value(s): On Success - Screen is adjusted ; On failure - Message with error description ;Requirement(s): Tested on AutoIt 3.2.10.0 ;Autor(s): R.Gilman (a.k.a rasim); special thanks to amel27 ; modified: nuts (www.autoit.de) ;==================================================================================== Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh) Local $reterror = False Local $DEVMODE, $DllRet $DEVMODE = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _ "ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _ "short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _ "short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _ "byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _ "dword dmDisplayFlags;dword dmDisplayFrequency") $DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _ "ptr", DllStructGetPtr($DEVMODE)) $DllRet = $DllRet[0] If $DllRet = 0 Then $reterror = "Unable to get graphic mode" SetError(1, 0, 0) Return $reterror EndIf $VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0") $VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM") RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0) DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE)) DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth) DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight) DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth) DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh) DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY)) $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST) ; hier wird geprüft ob die Änderung angenommen wurde $DllRet = $DllRet[0] If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then ;Auswertung $reterror = "Error: _ScreenSetting: " & $DllRet EndIf $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY) ;hier wird die Änderung dann durchgeführt $DllRet = $DllRet[0] DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _ "int", $SPI_SETNONCLIENTMETRICS, "int", 0) ;abfeuern der WM_DISPLAYCHANGE Nachricht (Auswirkungen unklar ) RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1) $DEVMODE = "" $DllRet = "" Return $reterror EndFunc ;==>_ScreenSetting Quote Link to comment
nuts Posted September 20, 2013 Share Posted September 20, 2013 Was in der Funktion _ScreenSetting so genau passiert muss dich ja nicht im Detail interessieren. Ist im Prinzip nur ein Dllcall zur winAPI (user32.dll). Quote Link to comment
Eichhorn Posted September 20, 2013 Author Share Posted September 20, 2013 (edited) Sooo viel ist nur das 1. Script???? Das 2. und 3. sind nicht so nötig, habe aber in der Hektik 2 vergessen: ;TotalMedia Theatre Focus setzenWinActivate("TotalMedia Theatre 6")Sleep(1000); Wiedergabe stoppenSend("{o}"); TotalMedia Theatre beendenProcessClose("uMCEPlayer6.exe")ProcessClose("uTotalMediaTheatre6.exe")Sleep(1000); Auflösung auf 50Hz stellensend("^+2"); = CTRG + SHIFT +2; J.River startenRun("C:\Program Files\J River\Media Center 19\media center 19.exe")Exit Sleep(500)ProcessClose("Media Center 19.exe")Sleep(500); Auflösung auf 24Hz stellenSend("^+4"); = CTRG + SHIFT +4 (im Profilmanager entsprechend anlegen)Sleep(1000); TotalMedia Theatre startenRun("C:\Program Files\ArcSoft\TotalMedia Theatre 6\uMCEPlayer6.exe", "", @SW_MAXIMIZE) Edited September 22, 2013 by Eichhorn Quote Link to comment
Eichhorn Posted September 20, 2013 Author Share Posted September 20, 2013 @Tüftler Das mit dem Neustart hat leider keine Verbesserung gebracht. @nuts Suuuper, das 1. Script von Dir geht erst einmal super. Kannst Du mir die Anderen noch machen? Gruß Eichhorn Quote Link to comment
Eichhorn Posted September 21, 2013 Author Share Posted September 21, 2013 @nuts Kannst Du mir die beiden letzten Scipte noch anpassen? Einfach die Hotkey Zeie gegen _ScreenSetting(1920, 1080, @DesktopDepth, 50) ; => 1080p50 autausche geht nicht. (natürlich mit 24Hz in dem Fall) Ich habe auch schon versuch Dein Script anzupassen, aber irgendwie wird es dann nicht korrekt abgearbeitet oder ich bekomme Fehlermeldungen. Kannst Du mir da bitte noch einmal helfen? Gruß Eichhorn Quote Link to comment
nuts Posted September 21, 2013 Share Posted September 21, 2013 Zeig doch mal deine Versuche. Bin grad nicht zuhause und vom Smartphone lässt sich nicht scripten. Quote Link to comment
Eichhorn Posted September 22, 2013 Author Share Posted September 22, 2013 Irgendwie war es wohl eher meine eigene Blöödheit, dass die Scripte nicht funktionierten. Ich hatte immer mal was vergessen oder halt einfach was falsches eingetragen. Jetzt sehen sie so aus: #include <WindowsConstants.au3> Global Const $DISP_CHANGE_SUCCESSFUL = 0 global Const $DISP_CHANGE_RESTART = 1 ;"Restart your computer for change display settings" global Const $DISP_CHANGE_FAILED = -1 ;"The video driver not set a new mode" global Const $DISP_CHANGE_BADMODE = -2 ;"Video mode not supported" global Const $DISP_CHANGE_NOTUPDATED = -3 ;"Video mode not supported" global Const $DISP_CHANGE_BADFLAGS = -4 ;"Bad flags" global Const $DISP_CHANGE_BADPARAM = -5 ;"Bad parameters" global Const $CDS_TEST = 0x4 global Const $CDS_UPDATEREGISTRY = 0x1 global Const $DM_PELSWIDTH = 0x80000 global Const $DM_PELSHEIGHT = 0x100000 global Const $DM_BITSPERPEL = 0x40000 global Const $DM_DISPLAYFREQUENCY = 0x400000 global Const $ENUM_CURRENT_SETTINGS = -1 global Const $HWND_BROADCAST = 0xFFFF global Const $SPI_SETNONCLIENTMETRICS = 0x2A ProcessClose("Media Center 19.exe") Sleep(500) ; Auflösung auf 24Hz stellen _ScreenSetting(1920, 1080, @DesktopDepth, 24) ;1080p24 ; _ScreenSetting(1920, 1080, @DesktopDepth, 23) ; oder 1080p23 => 23,976hz für Blurays Sleep(1000) ; TotalMedia Theatre starten Run("C:\Program Files\ArcSoft\TotalMedia Theatre 6\uMCEPlayer6.exe", "", @SW_MAXIMIZE) ;==================================================================================== ; ;Function Name: _ScreenSetting() ;Description: Changes the screen resolution, color dept and refresh rate ;Version: 1.0 ;Parameters: $iWidth - Width of the desktop screen in pixels. (horizontal resolution) ; $iHeight - Height of the desktop screen in pixels. (vertical resolution) ; $iDepth - Depth of the desktop screen in bits per pixel. ; $iRefresh - Refresh rate of the desktop screen in hertz. ;Return Value(s): On Success - Screen is adjusted ; On failure - Message with error description ;Requirement(s): Tested on AutoIt 3.2.10.0 ;Autor(s): R.Gilman (a.k.a rasim); special thanks to amel27 ; modified: nuts (www.autoit.de) ;==================================================================================== Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh) Local $reterror = False Local $DEVMODE, $DllRet $DEVMODE = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _ "ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _ "short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _ "short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _ "byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _ "dword dmDisplayFlags;dword dmDisplayFrequency") $DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _ "ptr", DllStructGetPtr($DEVMODE)) $DllRet = $DllRet[0] If $DllRet = 0 Then $reterror = "Unable to get graphic mode" SetError(1, 0, 0) Return $reterror EndIf $VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0") $VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM") RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0) DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE)) DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth) DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight) DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth) DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh) DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY)) $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST) ; hier wird geprüft ob die Änderung angenommen wurde $DllRet = $DllRet[0] If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then ;Auswertung $reterror = "Error: _ScreenSetting: " & $DllRet EndIf $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY) ;hier wird die Änderung dann durchgeführt $DllRet = $DllRet[0] DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _ "int", $SPI_SETNONCLIENTMETRICS, "int", 0) ;abfeuern der WM_DISPLAYCHANGE Nachricht (Auswirkungen unklar ) RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1) $DEVMODE = "" $DllRet = "" Return $reterror EndFunc ;==>_ScreenSetting und das zweite Script: #include <WindowsConstants.au3> Global Const $DISP_CHANGE_SUCCESSFUL = 0 global Const $DISP_CHANGE_RESTART = 1 ;"Restart your computer for change display settings" global Const $DISP_CHANGE_FAILED = -1 ;"The video driver not set a new mode" global Const $DISP_CHANGE_BADMODE = -2 ;"Video mode not supported" global Const $DISP_CHANGE_NOTUPDATED = -3 ;"Video mode not supported" global Const $DISP_CHANGE_BADFLAGS = -4 ;"Bad flags" global Const $DISP_CHANGE_BADPARAM = -5 ;"Bad parameters" global Const $CDS_TEST = 0x4 global Const $CDS_UPDATEREGISTRY = 0x1 global Const $DM_PELSWIDTH = 0x80000 global Const $DM_PELSHEIGHT = 0x100000 global Const $DM_BITSPERPEL = 0x40000 global Const $DM_DISPLAYFREQUENCY = 0x400000 global Const $ENUM_CURRENT_SETTINGS = -1 global Const $HWND_BROADCAST = 0xFFFF global Const $SPI_SETNONCLIENTMETRICS = 0x2A ;TotalMedia Theatre Focus setzen WinActivate("TotalMedia Theatre 6") Sleep(1000) ; Wiedergabe stoppen Send("{o}") ; TotalMedia Theatre beenden ProcessClose("uMCEPlayer6.exe") ProcessClose("uTotalMediaTheatre6.exe") Sleep(1000) ; Auflösung auf 50Hz stellen _ScreenSetting(1920, 1080, @DesktopDepth, 50) ;1080p50 ; J.River starten Run("C:\Program Files\J River\Media Center 19\media center 19.exe") ;==================================================================================== ; ;Function Name: _ScreenSetting() ;Description: Changes the screen resolution, color dept and refresh rate ;Version: 1.0 ;Parameters: $iWidth - Width of the desktop screen in pixels. (horizontal resolution) ; $iHeight - Height of the desktop screen in pixels. (vertical resolution) ; $iDepth - Depth of the desktop screen in bits per pixel. ; $iRefresh - Refresh rate of the desktop screen in hertz. ;Return Value(s): On Success - Screen is adjusted ; On failure - Message with error description ;Requirement(s): Tested on AutoIt 3.2.10.0 ;Autor(s): R.Gilman (a.k.a rasim); special thanks to amel27 ; modified: nuts (www.autoit.de) ;==================================================================================== Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh) Local $reterror = False Local $DEVMODE, $DllRet $DEVMODE = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _ "ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _ "short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _ "short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _ "byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _ "dword dmDisplayFlags;dword dmDisplayFrequency") $DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _ "ptr", DllStructGetPtr($DEVMODE)) $DllRet = $DllRet[0] If $DllRet = 0 Then $reterror = "Unable to get graphic mode" SetError(1, 0, 0) Return $reterror EndIf $VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0") $VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM") RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0) DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE)) DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth) DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight) DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth) DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh) DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY)) $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST) ; hier wird geprüft ob die Änderung angenommen wurde $DllRet = $DllRet[0] If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then ;Auswertung $reterror = "Error: _ScreenSetting: " & $DllRet EndIf $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY) ;hier wird die Änderung dann durchgeführt $DllRet = $DllRet[0] DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _ "int", $SPI_SETNONCLIENTMETRICS, "int", 0) ;abfeuern der WM_DISPLAYCHANGE Nachricht (Auswirkungen unklar ) RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1) $DEVMODE = "" $DllRet = "" Return $reterror EndFunc ;==>_ScreenSetting Beide funktionieren soweit. Ob da jetzt viel zu viel drin steht??? Quote Link to comment
nuts Posted September 22, 2013 Share Posted September 22, 2013 Nö sieht gut aus. Und wenns funktioniert umso besser. Quote Link to comment
Eichhorn Posted February 10, 2016 Author Share Posted February 10, 2016 Hallo Leute, ich muß hier diesen uralten Thread noch einmal vor holen. Ich habe mein System vor einigen Wochen auf Win 10 geupdatet. Bis zu diesem Zeitpunkt funktionierte das Script zum Umschalten der Auflösung und Frequenz einwandfei. Jetzt unter Win10 habe ich das Problem, dass das Script an irgend einer Stelle pausiert und nicht weiter abgearbeitet wird. Es hängt als Icon in der Taskleiste und es steht Pause da. Auch wenn ich dann auf Exit klicke wird es nicht beendet. Das ganze passiert aber nicht immer. Ich habe aber noch keine Regelmäßigkeit heraus gefunden. Das ganze muß vor dem erstellen der ini Datei passieren, da diese nicht geändert wird. Kann mir da jemand helfen? Hier noch einmal das Script. #include <WindowsConstants.au3>Global Const $DISP_CHANGE_SUCCESSFUL = 0global Const $DISP_CHANGE_RESTART = 1 ;"Restart your computer for change display settings"global Const $DISP_CHANGE_FAILED = -1 ;"The video driver not set a new mode"global Const $DISP_CHANGE_BADMODE = -2 ;"Video mode not supported"global Const $DISP_CHANGE_NOTUPDATED = -3 ;"Video mode not supported"global Const $DISP_CHANGE_BADFLAGS = -4 ;"Bad flags"global Const $DISP_CHANGE_BADPARAM = -5 ;"Bad parameters"global Const $CDS_TEST = 0x4global Const $CDS_UPDATEREGISTRY = 0x1global Const $DM_PELSWIDTH = 0x80000global Const $DM_PELSHEIGHT = 0x100000global Const $DM_BITSPERPEL = 0x40000global Const $DM_DISPLAYFREQUENCY = 0x400000global Const $ENUM_CURRENT_SETTINGS = -1global Const $HWND_BROADCAST = 0xFFFFglobal Const $SPI_SETNONCLIENTMETRICS = 0x2A$read = IniRead(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 1)Switch $read Case 1 _ScreenSetting(1920, 1080, @DesktopDepth, 24) ;1080p24 ; _ScreenSetting(1920, 1080, @DesktopDepth, 23) ; oder 1080p23 => 23,976hz für Blurays IniWrite(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 2) Case 2 _ScreenSetting(1920, 1080, @DesktopDepth, 50) ;1080p50 IniWrite(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 1)EndSwitch;====================================================================================;;Function Name: _ScreenSetting();Description: Changes the screen resolution, color dept and refresh rate;Version: 1.0;Parameters: $iWidth - Width of the desktop screen in pixels. (horizontal resolution); $iHeight - Height of the desktop screen in pixels. (vertical resolution); $iDepth - Depth of the desktop screen in bits per pixel.; $iRefresh - Refresh rate of the desktop screen in hertz.;Return Value(s): On Success - Screen is adjusted; On failure - Message with error description;Requirement(s): Tested on AutoIt 3.2.10.0;Autor(s): R.Gilman (a.k.a rasim); special thanks to amel27; modified: nuts (www.autoit.de);====================================================================================Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh) Local $reterror = False Local $DEVMODE, $DllRet $DEVMODE = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _ "ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _ "short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _ "short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _ "byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _ "dword dmDisplayFlags;dword dmDisplayFrequency") $DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _ "ptr", DllStructGetPtr($DEVMODE)) $DllRet = $DllRet[0] If $DllRet = 0 Then $reterror = "Unable to get graphic mode" SetError(1, 0, 0) Return $reterror EndIf $VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0") $VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM") RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0) DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE)) DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth) DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight) DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth) DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh) DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY)) $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST) ; hier wird geprüft ob die Änderung angenommen wurde $DllRet = $DllRet[0] If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then ;Auswertung $reterror = "Error: _ScreenSetting: " & $DllRet EndIf $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY) ;hier wird die Änderung dann durchgeführt $DllRet = $DllRet[0] DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _ "int", $SPI_SETNONCLIENTMETRICS, "int", 0) ;abfeuern der WM_DISPLAYCHANGE Nachricht (Auswirkungen unklar ) RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1) $DEVMODE = "" $DllRet = "" Return $reterror EndFunc ;==>_ScreenSetting Gruß Eichhorn Quote Link to comment
nuts Posted February 11, 2016 Share Posted February 11, 2016 Hast du bzw. der Benutzer auch Schreibrechte für das Verzeichnis? IniWrite(@ScriptDir & "\Umschalt.ini", "Frequenzumschaltung", "NextMode", 2) Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.