Monitor Eingang per script umschalten?

Picnic

Enthusiast
Thread Starter
Mitglied seit
04.11.2010
Beiträge
1.172
Ort
zwischen C und Z
Ich habe ein script (im Netz gefunden) für das Programm AutoHotkey, mit dem ich alle 3 Eingänge von meinem Monitor per Tastenkombi umschalten konnte. Praktisch unbegrenzt zwischen 2 Quellen hin und her. Alle 3 Eingänge sind belegt (2x HDMI 1x DP, am DP ist der PC mit dem AutoHotkey script). Falls kein Signal auf einer Quelle anlag, hat es automatisch zurück gewechselt. Das kann aber auch an der Auto-Funktion des Monitor gelegen haben. Die Nummern der Eingänge habe ich mit dem tool controlmymonitor ausgelesen. Jetzt hab ich einen neuen Monitor, welcher die gleichen Nummer (laut controlmymonitor) hat, aber das script funzt nicht mehr. Es schaltet nur noch auf einen Eingang, aber nicht wieder zurück. Kann evtl. mal jemand da drüber gucken, ob das überhaupt noch funktionieren kann? Ich hab mit den Nummern rumgespielt, vielleicht ist was verdreht. Wäre toll, wenn das wieder funktionieren würde, Brauch das öfters mal.

MfG Picnic

Code:
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Monitor Input umschalten mit Alt + m und Strg + Alt + m :::::::::::::::::::::::::::::


; Finds monitor handle
getMonitorHandle()
{
  ; Initialize Monitor handle
  hMon := DllCall("MonitorFromPoint"
    , "int64", 0 ; point on monitor
    , "uint", 1) ; flag to return primary monitor on failure

    
  ; Get Physical Monitor from handle
  VarSetCapacity(Physical_Monitor, 8 + 256, 0)

  DllCall("dxva2\GetPhysicalMonitorsFromHMONITOR"
    , "int", hMon   ; monitor handle
    , "uint", 1   ; monitor array size
    , "int", &Physical_Monitor)   ; point to array with monitor

  return hPhysMon := NumGet(Physical_Monitor)
}

destroyMonitorHandle(handle)
{
  DllCall("dxva2\DestroyPhysicalMonitor", "int", handle)
}

; Used to change the monitor source
; HDMI 1 = 17
; HDMI 2 = 18
; DP     = 15
setMonitorInputSource(source)
{
  handle := getMonitorHandle()
  DllCall("dxva2\SetVCPFeature"
    , "int", handle
    , "char", 0x60 ;VCP code for Input Source Select
    , "uint", source)
  destroyMonitorHandle(handle)
}

; Gets Monitor source
getMonitorInputSource()
{
  handle := getMonitorHandle()
  DllCall("dxva2\GetVCPFeatureAndVCPFeatureReply"
    , "int", handle
    , "char", 0x60 ;VCP code for Input Source Select
    , "Ptr", 0
    , "uint*", currentValue
    , "uint*", maximumValue)
  destroyMonitorHandle(handle)
  return currentValue
}

#IfWinActive
!m::
if(getMonitorInputSource() != 15)
  setMonitorInputSource(15)
else
  setMonitorInputSource(17)
return

;^!m::
;if(getMonitorInputSource() != 15)
;  setMonitorInputSource(15)
;else
;  setMonitorInputSource(18)
;return
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Welche Werte die korrekten währen kannst man im MCCS Standard auf S. 81 in „Table 8-13: Miscellaneous Functions VCP Codes“ nachlesen.

Dezimal 15, 17 und 18 wären also korrekt für DP 1, HDMI 1 und HDMI 2.

Ein mögliches Problem hier ist, dass die Werte, die der Monitor zu akzeptieren behauptet, korrekt währen und tatsächlich akzeptiert / verwendet je nach Hersteller des Monitors und des Klebers, den der Praktikant geschnüffelt hat, bevor er die Wertetabelle stumpfsinnig von einem komplett anderen Monitor kopiert hat, 3 sehr unterschiedliche Dinge sein können…

Mein Samsung C24RG5 behauptet beispielsweise, gültige Werte seien 0x01 und 0x03, also VGA 1 und DVI 1 (beides Anschlüsse, die der Monitor nicht hat).
Die tatsächlichen Anschlüsse lassen sich trotzdem ansteuern, indem man „ungültige“ Werte sendet, allerdings sind auch diese falsch belegt:
AnschlussKorrekter Wert laut StandardTatsächlich verwendeter Wert
DisplayPort 10x0F/150x0F/15
HDMI 10x11/170x05/5≙Composite video 1
HDMI 20x12/180x06/6≙Composite video 2

Ein HP ZR22w dagegen liefert zwar die richtigen Werte und verarbeitet diese auch korrekt, dropt dafür aber komplett vom DDC Bus (inklusive EDID) wenn man VCP Kommandos zu schnell hintereinander sendet. In dem Fall muss man dann einen hard reset (Strom abklemmen) durchführen, einfach per ein/aus Tatste „neu starten“ reicht nicht.

Monitore sind in meiner Erfahrung wie Mainboards: Wenn man glaubt, es gäbe keine gravierenden Firmware Bugs (die natürlich nie gefixt werden) hat man sie nur noch nicht gefunden.

Hab gerade nicht mehr im Kopf, ob ControlMyMonitor die vom Monitor angegebenen Werte oder die Im Standard definierten anzeigt. Aber so oder so ist nicht garantiert, dass sie auch Funktionieren (außer das umschalten funktioniert mit ControlMyMonitor problemlos). Ggf. ist die VCP Implementierung deines neuen Monitors auch einfach grundlegend kaputt (wenn z.B. der aktuelle Wert nicht ordentlich reportet wird, würde umschalten mit dem Skript nur in eine Richtung funktionieren).
 
Ich habs mittlerweile so geändert, daß ich nicht mehr hin und her zappen kann, sondern jede Quelle direkt anwählen muß. Sieht dann am Ende so aus...

Code:
#IfWinActive
!m::
  setMonitorInputSource(15)

^m::
  setMonitorInputSource(17)

^!m::
  setMonitorInputSource(18)
 
Für alle die noch suchen oder eine einfache Lösung suchen.

Die Software von Nirsoft (ControlMyMonitor) kann auch per Commandozeile ausgeführt werden.
Die Software einfach runterladen, extrahieren und starten (muss nicht installiert werden).
Wer es auf deutsch möchte muss zusätzlich die INI-Datei (ControlMyMonitor_lng.ini) runterladen und im selben Verzeichnis extrahieren.

1672751729058.png


Im "Drop-Down Menü Monitor (1)" den Monitor auswählen mit dem die Eingangsquelle gewechselt werden soll.
Unter VCP Code 60 findet man die Eingangsquelle (im Beispiel blau markiert - 15 = DP, 17 = HDMI)

Jetzt legt man im gleichen Verzeichnis eine "CMD-Datei" an (z.B. HDMI.cmd) und gibt folgenden Befehl ein:
ControlMyMonitor.exe /SetValue "\\.\DISPLAY2\Monitor0" 60 17
"\\.\DISPLAY2\Monitor0" = ausgewählter Monitor

60 = VCP-Code
17 = Eingangssignal HDMI

Nun erstellt man eine Verknüpfung der CMD-Datei auf dem Desktop und kann
- eine Tastenkombination vergeben
- Das Fenster minimiert starten
- und das Symbol ändern


1672752348766.png


Nun die CMD-Datei kopieren, einfügen und umbenennen (z.B. DP.cmd) und in der CMD-Datei den Eingangswert auf 15 ändern.
Unter Eigenschaften der CMD-Datei die Tastenkombination ändern und fertig.

Nun kann per Doppelklick auf die verknüpften CMD-Dateien oder per angelegte Tastenkombination zur eingangsquelle bequem hin- und hergeschalten werden.
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh