Guru3D.com Forums

Go Back   Guru3D.com Forums > Videocards > Videocards - NVIDIA
Videocards - NVIDIA This forum is all about NVIDIA graphics cards and their technology. Do you have a question regarding an older GeForce videocard? Want to tell people how stylish a game works on that new shiny watercooled GeForce GTX 580 or SLI gaming rig? Get in here!


Reply
 
Thread Tools Display Modes
Switching Primary Monitor Using Command Line (even on Vista with SLI enabled)
Old
  (#1)
ESPNSTI
Newbie
 
ESPNSTI's Avatar
 
Videocard: eVGA e-GeForce 8800GTS 640MB
Processor: Intel Core 2 Duo E6700 Conroe 2.66G
Mainboard: eVGA nForce 680i SLI 775 AR
Memory: 4GB Corsair XMS2 Dominator 800 Mhz
Soundcard: X-Fi XtremeGamer Fatal1ty Pro
PSU: OCZ GameXStream OCZ700GXSSLI 700W
Post Switching Primary Monitor Using Command Line (even on Vista with SLI enabled) - 04-06-2008, 04:40 | posts: 6 | Location: Decorah, IA, USA

Ok, I'd figure I'd share this in case someone was as annoyed as I originally was by the lack of a simple functioning command line option to switch the primary monitor from my PC to my HDTV.
I know there is an API in nvcpl.dll, and I was using that, but that doesn't work in Vista, so I switched to using UltraMon.
However, now that I went SLI, I can't use that either.

Basically what I was looking for was a way to switch my primary monitor to my HDTV (in the other room), so I can watch videos on there.
Then when I'm done I need to switch back to my PC.
Since I do that relatively often, I wanted to have a way of doing that without having to jump through all the hoops of manually changing it using the control panel.

So what I did was to create a vbscript file that opens up the nVidia control panel and switches the primary monitor for me. (And it does some other stuff too).

To use this, copy all the text in the "Code:" window below, put it in a text file and save it as SetVideoLocation.vbs (make sure it isn't saved as SetVideoLocation.vbs.txt).
Then follow the instructions in the top section of the SetVideoLocation.vbs file itself.

Just to be clear, the script is pretty crude and I've only ever tested it in my situation, so if something doesn't work for you, then that wouldn't be a surprise to me.

SetVideoLocation.vbs:
Code:
'---------------------------------------------------------------------------------------------------
' SetVideoLocation.vbs
'
' This (crude) script switches the primary monitor from the 'PC' monitor to the 'TV' monitor and 
' vice versa. It does this using either the nVidia control panel or using Ultramon.
' In addition, it can set SPDIF, FFDShow and Creative X-Fi settings based on the switch to 
' either 'PC' or 'TV'.
'
' Usage:
'   1) Put this script (and the optional SetVideoLocation_PC.reg and SetVideoLocation_TV.reg
'      in any place you like.
'   2) Edit the "Parms" section below and at the minimum change the 'monPCName' and 'monTVName'
'      parameters. And then save the file (duh).
'   3) Create two short cuts to this (SetVideoLocation.vbs) file.
'      Edit one of the short cuts and add " PC" to the end of the "Target" field, 
'      and edit the other one so that it has " TV" at the end of the "Target" field. 
'      Bind each shortcut to a shortcut key for easy use.
'   4) Optionally edit the SetVideoLocation_PC.reg and SetVideoLocation_TV.reg files to change
'      settings to your liking.
'      By default the reg files will:
'        In MPC:
'          - Enable (PC) or disable (TV) Dolby/DTS decoding in the internal filters.
'          - Enable (TV) or disable (PC) SPDIF in the internal filters.
'          - Set the audio renderer to SPDIF (TV) or default (PC).
'          - Set the full screen res to 1920x1080 (TV) or default (PC).
'        In ffdshow:
'          - Set the active preset to TV (TV) or default (PC).
'          
'
' I've only ever tested this on my machine using:
'   Vista 64 SP1
'   nVidia Forceware 180.48
'   UltraMon 3.0.3
'   X-Fi Mode 1.7 build 22
'   eVga 8800GTS 640mb (both in Sli mode and also with it disabled)
'   LG L204WT PC Monitor
'   Onkyo TX-SR875 HDMI receiver
'
' I'm not responsible for any damage, or anything like that, use at your own risk.
' Don't count on me spending a lot of time on figuring out why it's not working on your machine.
' If it isn't working, you can always use Google to learn vbscript :)
' I'm not going to add any sort of new feature to this. I'm just too busy to do that sort of thing.
'---------------------------------------------------------------------------------------------------



REM Script Parameter One: 
REM PC = set to at PC viewing
REM TV = set to at TV viewing



'---------------------------------------------------------------------------------------------------
' Parms
'---------------------------------------------------------------------------------------------------

    '<SwitchUsingUltraMon> : 
    '     If 'True', will switch using UltraMon. In the past, UltraMon didn't appear to have a way 
    '               to switch monitors if SLI was enabled.
    '     If 'False', primary monitor will switch by bringing up and manipulating the 
    '               nVidia control panel. This will only function if you're using sli (enabled).
    '               Note that UltraMon will still be used if you specify a resolution to change to.
SwitchUsingUltraMon=True

If SwitchUsingUltraMon=False Then
      ' <monPCName> and <monTVName>: 
      '     Set to the first few characters of the name of the monitor for the PC and the TV as it 
      '     appears in the 'Set up multiple displays' page of the nVidia Control Panel.
  monPCName = "LG Electronics L204WT"                                                              '<-- EDIT THIS
  monTVName = "TX-SR875"                                                                           '<-- EDIT THIS
Else      
      ' <monPCName> and <monTVName>:
      '     Set to the name of the monitor for the PC and the TV as it appears in 
      '     the Windows Device Manager in 'Monitors'. 
      '     (You only need to set this if SwitchUsingUltraMon=True)
      '     If the names of the monitors are identical, then there is a way around by editing the 
      '     Device Name in the registry, but I won't go in to that here.
  monPCName = "LG L204WT"
  monTVName = "Onkyo TX-SR875"
End If

    '<monPCRes> and <monTVRes> :
    '     Uses ultramon to switch resolutions if specified.
monPCRes  = ""  ' Example: "1680x1050x32"
monTVRes  = ""  ' Example: "1768x992x32"

    '<AllowSetMPCandFFDShowSettings> : 
    '     If 'True', will do such things as set SPDIF settings in Media Player Classic,
    '     and set a 'TV' profile in FFDShow. You will need to have SetVideoLocation_PC.reg
    '     and SetVideoLocation_TV.reg for this.
AllowSetMPCandFFDShowSettings=False

    '<AllowSetCreativeXFIMode> : 
    '     If 'True' will use the XFMC utility to set the Creative X-Fi mode 
    '     to 'ENTERTAINMENT' when switching to TV or 'GAME' when switching to PC
    '<CreativeXFIPath> :
    '     Set to the path of the XFMC utility. (Path must end in a backslash.)
AllowSetCreativeXFIMode=False
CreativeXFIPath = "C:\Drivers\Creative\XFMC\"

    '<gLogEnabled> : 
    '     Logging enabled if 'True', disabled if 'False'.
    '<LogFileName>'
    '     Name of the log file.
gLogEnabled = True
LogFileName = "SetVideoLocation.log"


    'Below are times (in milliseconds) that the script waits at certain points for things to load
    'So if the script isn't working for you, try increasing these numbers.
    'These are only used when SwitchUsingUltraMon=False.
WaitTime_UntilControlPanelActive=10000
WaitTime_AfterControlPanelActive=500
WaitTime_AfterMonitorSelectionMade=500
WaitTime_AfterApplyMonitorSelection=500
WaitTime_UntilApplyChanges1Active=5000
WaitTime_AfterApplyChanges1Active=500
WaitTime_AfterApplyChanges1Accepted=500
WaitTime_UntilApplyChanges2Active=10000  ' The actual monitor switching happens during this time.
WaitTime_AfterApplyChanges2Active=500
WaitTime_AfterApplyChanges2Accepted=500

'---------------------------------------------------------------------------------------------------

If WScript.Arguments.Count = 0 Then
  Config = "PC"
Else
  Config = WScript.Arguments(0)
End If

'---------------------------------------------------------------------------------------------------
' Main Begin
'---------------------------------------------------------------------------------------------------
Set gobjLog = LogFileOpen(LogFileName)

Set gobjShell = CreateObject("WScript.Shell")


  Log("Set location to: " & Config & "  SwitchUsingUltraMon: " & SwitchUsingUltraMon _
      & "  monPCName: " & monPCName & "  monTVName: " & monTVName _
      & "  monPCRes: " & monPCRes & "  monTVRes: " & monTVRes)

  REM - Switch primary monitor


  If SwitchUsingUltraMon=True Then
    SwitchMonitorUltraMon(Config)
  Else  
    SwitchMonitorNVidiaControlPanel(Config)
  End If


  REM - Set Media Player Classic & FFDShow settings
  If AllowSetMPCandFFDShowSettings=True Then SetMPCAndFFDShowSettings(Config)


  If AllowSetCreativeXFIMode=True Then
    REM - Set the Creative mode
    If Config = "PC" Then
      SetCreativeXFIMode "GAME", CreativeXFIPath
    End If
    If Config = "TV" Then
      SetCreativeXFIMode "ENTERTAINMENT", CreativeXFIPath
    End If
  End If


Set gobjShell = Nothing

Log("Done")

If gLogEnabled = True Then LogFileClose()
'---------------------------------------------------------------------------------------------------
' Main End
'---------------------------------------------------------------------------------------------------



'---------------------------------------------------------------------------------------------------
'Switches monitors using the nVidia control panel.
'
'This causes the nVidia control panel to come up, but it should work even with SLI enabled.
'---------------------------------------------------------------------------------------------------
Sub SwitchMonitorNVidiaControlPanel(aConfig)

    'NVidia Control Panel UI Page Class GUIDs (at least for 174.74)

    '- 3D Settings (normally not reachable from UI?)
    '    CLASS_3DSettings = "{3156EC84-29BD-4EAA-AE0A-817ED606FA99}"

    '  - Adjust image settings with preview
    '      CLASS_AppSettingsBasic = "{9B5EC720-9A44-4811-8B9F-24BD53F2050D}"
    '      CLASS_AppSettingsAdv = "{EBF88566-91F5-4045-B7CA-426E59DDE635}"
    '  - Manage 3D settings
    '      CLASS_Manage3DSettings = "{BBB7D605-8639-49D0-849E-32C4A5DBB9C3}"
    '  - Set SLI configuration
          CLASS_SliBasic = "{DE0549BD-F34D-4748-AD94-0F2F22749F4F}"


    '- Display (normally not reachable from UI?)
    '    CLASS_Display = "{73BCA54E-6AEB-4597-8F27-E1284FF12722}"

  
    '  - Change resolution
    '      CLASS_ChangeRes = "{382AF4B5-7F74-4040-B1FE-A861AF2D7402}"
          CLASS_ChangeResAdv = "{5F9C8FEF-4352-43C0-AF63-88FF124C34F7}"
    '  - Change flat panel scaling
    '      CLASS_ScreenTimingDVI = "{51840041-B26F-4843-B358-22ABB067396C}"
    '  - Adjust desktop color settings
    '      CLASS_ColorSettings = "{AB866564-F241-49B2-B0A7-D6C537340728}"
    '      CLASS_ColorSettingsAdv = "{B53EBC0C-2251-4AE2-9818-FD6AAF843***}"
    '  - Rotate display
    '      CLASS_RotateDisplay = "{6017A978-93AD-4F2F-9E2D-07CF8C8DEBC4}"
    '  - Manage custom resolutions
    '      CLASS_CustomRez = "{49F585C0-CE12-4306-9100-B6A28857B10B}"
    '  - Set up multiple displays
    '      CLASS_NviewBasic = "{9090879C-1A43-43C0-B7A6-975A8ED5E0D6}"
    '      CLASS_NView = "{7945F814-7BFB-4506-A113-2BD66CDC713A}"


    '- Performance (normally not reachable from UI?)
    '    CLASS_MainPerfServer = "{FA7602F2-CC0D-4137-9831-D4606E9A2B52}"

    '  - Device settings
    '      CLASS_ClockCtrlPage = "{B0FB6FFE-42C5-4942-93ED-3467893F978D}"
    '  - Dynamic BIOS access
    '      CLASS_AdjustBiosSettingPage = "{3786D5BA-5038-4135-8878-91CA0C92393C}"
    '  - View system information
    '      CLASS_SystemInfoPage = "{31A73CC4-962E-4D15-90EC-7201688460D6}"
    '  - Profile policies
    '      CLASS_AdjustCustomRulesPage = "{72ADDC05-0B40-4B60-846A-674E4EDD151F}"


    '- System Update (normally not reachable from UI?)
    '    CLASS_MainUpdateServer = "{20486BE1-C1D1-4838-98FD-E9AF679AC701}"

    '  - Update your System BIOS
    '      CLASS_UpdateSBIOS = "{224CD9A4-DE80-4D9A-ACDD-E24204A1F039}"
    '  - Update your System Drivers
    '      CLASS_UpdateDrivers = "{04110D75-E5A4-4526-BE98-1108CA89EC44}"

    '- Video & Television (normally not reachable from UI?)
    '    CLASS_VideoTelevision = "{3E500C0C-5D15-4610-8095-7CEBD4C43F24}"


    '  - Adjust video color settings
    '      CLASS_VideoColorSettings = "{055A7699-EAFF-47DF-8E55-41F4C0612BF3}"
    '  - Adjust video image settings
    '      CLASS_VideoImageSettings = "{EF884939-F1EA-4EFB-B676-D2F802177C5F}"
    '  - Change the signal or HD format
    '      CLASS_TVFormat = "{89B53798-9A96-4758-9571-93B72CAA5381}"


  Log("  Open nVidia Control 'Set SLI and PhysX configuration' page")
  gobjShell.Run("nvcplui.exe /page:" & CLASS_SliBasic)
  ControlPanelActive = WaitForAppActivate("NVIDIA Control Panel", WaitTime_UntilControlPanelActive)
  KeepGoing = ControlPanelActive

  If KeepGoing = True Then 
    WScript.Sleep(WaitTime_AfterControlPanelActive)

    Log("    Changing Monitor Selection")
    gobjShell.SendKeys("%c")
    IF aConfig = "TV" Then
      monNew = monTVName
      monOld = monPCName
    Else
      monNew = monPCName
      monOld = monTVName
    End If

    REM Figure out the least keystrokes to uniquely select the monitor
    mon=""
    i=0
    Do
      i=i+1
      mon=mon+Mid(monNew,i,1)
    Loop Until i>Len(monOld) Or i>Len(monNew) Or Mid(monNew,i,1)<>Mid(monOld,i,1)

    gobjShell.SendKeys(mon)
    WScript.Sleep(WaitTime_AfterMonitorSelectionMade)

    Log("    Trigger Apply changes by switching to another nVidia Control Panel Page")
    gobjShell.Run("nvcplui.exe /page:" & CLASS_ChangeResAdv)
    KeepGoing = WaitForAppActivate("Apply Changes", WaitTime_UntilApplyChanges1Active)

  End If

  IF KeepGoing = True Then
    WScript.Sleep(WaitTime_AfterApplyChanges1Active)

    Log("    Applying Changes")
    gobjShell.SendKeys("%Y")
    WScript.Sleep(WaitTime_AfterApplyChanges1Accepted)

    KeepGoing = WaitForAppActivate("Apply Changes", WaitTime_UntilApplyChanges2Active)
  
  End If

  IF KeepGoing = True Then
    WScript.Sleep(WaitTime_AfterApplyChanges2Active)

    Log("    Accepting Changes")
    gobjShell.SendKeys("%Y")
    WScript.Sleep(WaitTime_AfterApplyChanges2Accepted)

  End If

  If ControlPanelActive Then
    Log("  Closing nVidia Control Panel")
    gobjShell.SendKeys("%{F4}")
  End If

  If KeepGoing = True Then

    IF aConfig = "TV" Then
      monRes = monTVRes
    Else
      monRes = monPCRes
    End If 

    If monRes<>"" Then
      SwitchResoltionUltraMon monRes, aConfig
    End If

  End If

End Sub


'---------------------------------------------------------------------------------------------------
'Switches monitors using ultramon. ( http://realtimesoft.com/ultramon/ )
'
'This does not cause the nVidia control panel to come up, 
'but in the past it didn't work with SLI enabled.
'---------------------------------------------------------------------------------------------------
Sub SwitchMonitorUltraMon(aConfig)

  Dim sys, mon1, mon2
  Set sys = CreateObject("UltraMon.System")
  Set monPC = sys.Monitors("1")
  Set monTV = sys.Monitors("2")

  Log("  Monitor 1: " & monPC.Name)
  Log("  Monitor 2: " & monTV.Name)

  REM - Ensure we have the right monitor
  If monTV.Name = monPCName Or monPC.Name = monTVName Then
    Log("Swapping PC and TV")
    Set monSwap = monTV
    Set monTV = monPC
    Set monPC = monSwap
    Set monSwap = Nothing
  End If

  Log("State before the switch:")
  Log("  PC Monitor (" & monPC.Name & ") Enabled: " & monPC.Enabled & " Primary: " & monPC.Primary)
  Log("  TV Monitor (" & monTV.Name & ") Enabled: " & monTV.Enabled & " Primary: " & monTV.Primary)

  IF aConfig = "PC" And monPC.Name <> "" Then
    
Log("Set Changes for switch to PC")

    monPC.Enabled = -1
    monTV.Enabled = 0
  
    monTV.Primary = 0
    monPC.Primary = -1
  End If
  IF aConfig = "TV" And monTV.Name <> "" Then
    
Log("Set Changes for switch to TV")

    monTV.Enabled = -1
    monPC.Enabled = 0

    monPC.Primary = 0
    monTV.Primary = -1

  End If

  sys.ApplyMonitorChanges

  Log("State after the switch:")
  Log("  PC Monitor (" & monPC.Name & ") Enabled: " & monPC.Enabled & " Primary: " & monPC.Primary)
  Log("  TV Monitor (" & monTV.Name & ") Enabled: " & monTV.Enabled & " Primary: " & monTV.Primary)

  Set MonTV = Nothing
  Set MonPC = Nothing
  Set sys = Nothing

  IF aConfig = "TV" Then
    monRes = monTVRes
  Else
    monRes = monPCRes
  End If 

  If monRes<>"" Then
    SwitchResoltionUltraMon monRes, aConfig
  End If

End Sub

'---------------------------------------------------------------------------------------------------
'Switches resolutions using UltraMon. ( http://realtimesoft.com/ultramon/ )
'
'---------------------------------------------------------------------------------------------------
Sub SwitchResoltionUltraMon(aResolution, aConfig)

  Log("  Changing resolution to: " & aResolution)

  Set sys = CreateObject("UltraMon.System")
  IF aConfig = "TV" Then
    Set mon = sys.Monitors("2")
  ELSE
    Set mon = sys.Monitors("1")
  END IF

  resArray = Split(aResolution, "x")

  mon.Width = resArray(0)
  mon.Height = resArray(1)
  If UBound(resArray)>=2 Then
    mon.Colordepth = resArray(2)
  End If

  sys.ApplyMonitorChanges

  Set Mon = Nothing
  Set sys = Nothing

End Sub


'---------------------------------------------------------------------------------------------------
'Sets Media Player Classic and FFDShow settings
'
'All it does is enter a file name SetVideoLocation_PC.reg or SetVideoLocation_TV.reg in to the
'registry, so theoretically you could mod the .reg files to do whatever you need it to with
'other programs as well.
'---------------------------------------------------------------------------------------------------
Sub SetMPCAndFFDShowSettings(aConfig)

  Log("Media Player Classic & FFDShow - Activate the settings")

  REM - Registry - Media Player Classic & FFDShow - Activate the settings
  gobjShell.Run "%WINDIR%\regedit.exe /s SetVideoLocation_" & aConfig & ".reg", 8, true

End Sub

'---------------------------------------------------------------------------------------------------
'Sets the Creative X-Fi mode
'
'Calls the XFiMode program. ( http://www.spectra9.com/xfmc/xfmc.html )
'---------------------------------------------------------------------------------------------------
Sub SetCreativeXFIMode(aCreativeMode, aXFMCPath)

  Log("Creative - Set X-Fi mode to: " & aCreativeMode)

  REM - Creative - Activate the mode settings
  gobjShell.Run aXFMCPath & "XFiMode.Exe /" & aCreativeMode, 8, true

End Sub




'---------------------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------------
Function LogFileOpen(aLogFileName)

  If gLogEnabled = True Then 
      Set objFSO = CreateObject("scripting.filesystemobject")
    If objFSO.FileExists(logFileName) Then
      Set objLog = objFSO.OpenTextFile(aLogFileName, 8, True)
    Else
      Set objLog = objFSO.CreateTextFile(aLogFileName, True)
    End If
    Set objFSO = Nothing

    objLog.writeline ""
  Else
    Set objLog = Nothing
  End If
  Set LogFileOpen = objLog

End Function


'---------------------------------------------------------------------------------------------------
Sub Log(aLogText)

  If gLogEnabled = True Then 
    gobjLog.writeline Now & "  " & aLogText
  End If

End Sub


'---------------------------------------------------------------------------------------------------
Sub LogFileClose

  If gLogEnabled = True Then 
    gobjLog.Close

    Set gobjLog = Nothing
  End If

End Sub


'---------------------------------------------------------------------------------------------------
Function WaitForAppActivate(aCaption, aTimeOut)
  
  maxLoop = aTimeOut / 100

  Do
    ret = gobjShell.AppActivate(aCaption)
    If ret = False Then
      WScript.Sleep(100)
      maxLoop = maxLoop - 1
    End If
  Loop Until ret = True Or maxLoop = 0

  If Ret = False Then
    Log("Failed to activate: " & aCaption & " in " & aTimeOut & " milliseconds.")
  End If

  WaitForAppActivate=ret

End Function
SetVideoLocation_TV.reg:
Code:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Gabest\Filters\MPEG Audio Decoder]
"Ac3SpeakerConfig"=dword:ffffffe9
"DtsSpeakerConfig"=dword:ffffff77
"AacSpeakerConfig"=dword:00000000

[HKEY_CURRENT_USER\Software\Gabest\Media Player Classic\Settings]
"FullscreenRes"=hex:01,80,07,00,00,38,04,00,00,20,00,00,00,3C,00,00,00
"AudioRendererType"="@device:cm:{E0F158E1-CB04-11D0-BD4E-00A0C911CE86}\\SPDIF Out (Creative SB X-Fi)"

[HKEY_CURRENT_USER\Software\GNU\ffdshow]
"activePreset"="TV"
SetVideoLocation_PC.reg:
Code:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Gabest\Filters\MPEG Audio Decoder]
"Ac3SpeakerConfig"=dword:00000017
"DtsSpeakerConfig"=dword:00000089
"AacSpeakerConfig"=dword:00000000

[HKEY_CURRENT_USER\Software\Gabest\Media Player Classic\Settings]
"FullscreenRes"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
"AudioRendererType"=""

[HKEY_CURRENT_USER\Software\GNU\ffdshow]
"activePreset"="default"

Last edited by ESPNSTI; 12-20-2008 at 02:26. Reason: Updated for Forceware 180.48
   
Reply With Quote
 
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump



Powered by vBulletin®
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
vBulletin Skin developed by: vBStyles.com
Copyright (c) 1995-2014, All Rights Reserved. The Guru of 3D, the Hardware Guru, and 3D Guru are trademarks owned by Hilbert Hagedoorn.