Hallo zusammen,
ich habe schon so einige Sachen mit AutoIt gelöst - leider fast alles mit "geklauten" Codeschnipseln
Daher halten sich meine Kenntnisse stark in Grenzen.
Ich habe jedenfalls einen HTPC, der per AVR an den TV (und per DVI / VGA an einen Beamer) angeschlossen ist.
Wenn der PC länger im S3 verweilt und / oder man eine "ungünstige" Einschaltreihenfolge der Geräte wählt bleibt der Bildschirm schwarz und lässt sich nur mittels "Desktop" -> "Rechtsklick" -> "Bildschirmauflösung" und dann "erkennen" wieder zum laufen bringen - weiß ich dank einloggen per TeamViewer.
Alles anderen Lösungswege wie: devcon.exe, "so ne Box, die immer einen aktiven Bildschirm vorgaukelt", verschiedenste ATI-Grafiktreiber getestet, Tools wie HDMI on oder HDMIYo als Sript per Tastendruck ausführen zu lassen, etc, pp, usw..., haben leider keinen Erfolg gebracht.
Erschwert, bzw. verhäufigt wird die ganze Problematik noch durch was hausgemachtes: Ich habe den PIN 19 am HDMI Kabel abgeklebt, damit Windows beim Wechsel der Quelle am AVR (ohne Standby PassThrough) die Auflösung nicht ändert (was zwangsläufig zu einem Abbruch der Medienabspielung in Mediaportal führt).
Per AutoIt "Windows Taste + p" zu senden ist mir zu Fehleranfällig
(Manchmal ist der AVR als Bildschirm angelegt, der Dialog dann auf "nur Computer", meistens aber wie im Normalfall der TV und Beamer und die Einstellung damit auf "Doppelt", jedenfalls zu unkalkulierbar).
Die Suche (auch per Google) hat mir viele Scripts und Schnipsel geliefert, die aber allesamt für Auflösungsänderungen verantwortlich sind.
In solch einem Scripts müsste die Lösung doch quasi "nebenan" zu finden sein, jedenfalls wenn man das als menschlicher Benutzer sieht
z.B. hier sowas:
Spoiler anzeigen
$vRes = _ChangeScreenRes(1024, 768)
;===============================================================================
;
; Function Name: _ChangeScreenRes()
; Description: Changes the current screen geometry, colour and refresh rate.
; Version: 1.0.0.1
; Parameter(s): $i_Width - Width of the desktop screen in pixels. (horizontal resolution)
; $i_Height - Height of the desktop screen in pixels. (vertical resolution)
; $i_BitsPP - Depth of the desktop screen in bits per pixel.
; $i_RefreshRate - Refresh rate of the desktop screen in hertz.
; Requirement(s): AutoIt Beta > 3.1
; Return Value(s): On Success - Screen is adjusted, @ERROR = 0
; On Failure - sets @ERROR = 1
; Forum(s): http://www.autoitscript.com/forum/index.php?showtopic=20121
; Author(s): Original code - psandu.ro
; Modifications - PartyPooper
;
;===============================================================================
Func _ChangeScreenRes($i_Width = @DesktopWidth, $i_Height = @DesktopHeight, $i_BitsPP = @DesktopDepth, $i_RefreshRate = @DesktopRefresh)
Local Const $DM_PELSWIDTH = 0x00080000
Local Const $DM_PELSHEIGHT = 0x00100000
Local Const $DM_BITSPERPEL = 0x00040000
Local Const $DM_DISPLAYFREQUENCY = 0x00400000
Local Const $CDS_TEST = 0x00000002
Local Const $CDS_UPDATEREGISTRY = 0x00000001
Local Const $DISP_CHANGE_RESTART = 1
Local Const $DISP_CHANGE_SUCCESSFUL = 0
Local Const $HWND_BROADCAST = 0xffff
Local Const $WM_DISPLAYCHANGE = 0x007E
If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
Local $B = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))
If @error Then
$B = 0
SetError(1)
Return $B
Else
$B = $B[0]
EndIf
If $B <> 0 Then
DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
DllStructSetData($DEVMODE, 4, $i_Width, 2)
DllStructSetData($DEVMODE, 4, $i_Height, 3)
DllStructSetData($DEVMODE, 4, $i_BitsPP, 1)
DllStructSetData($DEVMODE, 4, $i_RefreshRate, 5)
$B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
If @error Then
$B = -1
Else
$B = $B[0]
EndIf
Select
Case $B = $DISP_CHANGE_RESTART
$DEVMODE = ""
Return 2
Case $B = $DISP_CHANGE_SUCCESSFUL
DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
$DEVMODE = ""
Return 1
Case Else
$DEVMODE = ""
SetError(1)
Return $B
EndSelect
EndIf
EndFunc ;==>_ChangeScreenRes
Alles anzeigen
Oben alles unwichtiges Gerede, daher meine eigentliche Frage:
Ist es irgendwie möglich den Befehl zu geben, dass der / die Bildschirme neu erkannt werden?
Zur Not: Kann man oben aufgeführte ("Desktop" -> "Rechtsklick" -> "Bildschirmauflösung" und dann "erkennen") zuverlässig ausführen lassen
(Mediaportal per Taskkill beenden, "Fokus" auf den Desktop legen, so dass der Rechtsklick auch wirklich das auslöst was er soll, etc.)?
Ziel ist in jedem Fall, dass ganze dann als eine .exe zu speichern, die per Tastenkombination ausgeführt werden kann (man ist ja "blind").
Besten Dank im Voraus!
mfg Balduris