Kerninhalt des Projektes: ein Programm, welches die Anmeldung an unserem W2012-R2-Terminalservern managt. Sprich, es werden teils mehrere RDP-Sitzungen gleichzeitig überwacht und gesteuert. Der Anwender loggt sich auf seinem Windows-7-PC nur einmal ein und kann dann mit seinen Anmeldedaten auf Knopfdruck verschiedene Terminalserver ansteuern (und auch Remotefreigaben öffnen etc). Hierzu nutze ich bereits seit Jahren das ActiveX-Control ObjCreate("MsTscAx.MsTscAx"). Nun muss ich den ersten Windows-7-Arbeitsplatz mit 2 Monitoren einbinden. Erfolgreich geschafft habe ich bereits SPAN, aber nicht UseMultimon = True. Sprich beide Full-HD-Monitore stehen nebeneinander und ich übergebe ein RDP-Control mit 3840x1020 Größe im Vollbild und bekomme ein großes Bild über beide Monitore - aber eben wie ein einziger Monitor.
Unterschied SPAN zu Multimon:
- wenn ich im SPAN-Mode ein Programm im Terminalserver auf Vollbild stelle, wird es 3840x1020px groß und erstreckt sich über beide Monitore.
- wenn ich im Multimon-Modus ein Programm im Terminalserver auf Vollbild stelle, wird es 1920x1020px groß und landet in dem Monitor als Vollbild, in dem es vorher als Fenster lag.
Ich benötige useMultimon = True in Vollbilddarstellung FullScreen = TRUE, um z.B. zwei Programme im Vollbild auf den beiden Monitoren zu fahren.
Wenn ich einfach zur Gegenprobe die mstsc.exe aufrufe und dort bei "Optionen einblenden", Registerkarte "Anzeige" den Haken bei "Alle Monitore für Remotesitzung verwenden" aktiviere, klappt es genau so wie von mir gewünscht. Genau diese Konfiguration möchte ich mittels Scripting erreichen. Ich benötige aber das Axtive-X-Control, da ich die Zustände der Verbindung überwache (Connected etc.). Aktuell verwendet das Script auf Windows 7 SP1 "MsTscAx.MsTscAx.9".
Ich komme mit der Einbindung des "IMsRdpClientNonScriptable5 Interface" in das vorhandene Activex-X-Objekt nicht klar: https://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
Vergütung: 150€
Noch hilfreiche Quellen könnten sein:
http://blogs.msdn.com/b/winsdk/archi…ol-session.aspx
https://social.technet.microsoft.com/Forums/Windows…rum=winserverTS
https://msdn.microsoft.com/en-us/library/…2(v=vs.85).aspx
Das gesamte Anmeldeprogramm ist um Längen größer, aber ich habe mal die relevanten Teile in ein eigenes Testprogramm ausgelagert:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
For $i = 9 To 1 Step -1
$oRDP= ObjCreate("MsTscAx.MsTscAx." & $i)
If NOT @error Then ExitLoop
Next
If IsObj($oRDP) = 0 Then $oRDP= ObjCreate("MsTscAx.MsTscAx")
$guirdp = GUICreate("Test", 952, 675)
$oRDP_Ctrl = GUICtrlCreateObj($oRDP, -1, -1)
GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
;GUICtrlSetStyle($oRDP_Ctrl , $WS_VISIBLE)
GUISetState()
$oRDP.Server = "IP.des.RDP.Servers"
$oRDP.Domain = "net-bios-Domain-name"
$oRDP.UserName = "Benutzername"
$oRDP.AdvancedSettings2.ClearTextPassword = "Passwort"
$oRDP.ColorDepth = "32"
$oRDP.FullScreenTitle = "Test"
$oRDP.AdvancedSettings2.RedirectDrives = False
$oRDP.AdvancedSettings2.RedirectPrinters = False
$oRDP.AdvancedSettings2.RedirectPorts = False
$oRDP.AdvancedSettings2.RedirectSmartCards = False
$oRDP.SecuredSettings2.AudioRedirectionMode = 2
$oRDP.AdvancedSettings7.EnableCredSspSupport = TRUE
;$oRDP.AdvancedSettings.ContainerHandledFullScreen = 1
;$oRDP.AdvancedSettings3.SmartSizing = True
$desktopSize = WinGetPos("Program Manager")
If $desktopSize[2] > 4096 Then
$oRDP.DesktopWidth = 4096
Else
$oRDP.DesktopWidth = $desktopSize[2]
EndIf
If $desktopSize[3] > 2048 Then
$oRDP.DesktopHeight = 2048
Else
$oRDP.DesktopHeight = $desktopSize[3]
EndIf
$oRDP.FullScreen = TRUE
;bis hier her funktioniert mein Code prima
;ab hier komm ich nicht mehr weiter und hab rumprobiert
;$oRDP.NonScriptable5.UseMultimon = TRUE
;ControlSend($oRDP,"", "UseMultimon", True)
;$test = $oRDP.GetOcx()
;$test.UseMultimon = true
;$oRDP.AdvancedSettings.ContainerHandledFullScreen = 1
;
;das hier ist etwas, was ich gefunden habe, womit es gehen soll, ich kann es aber nicht nach Autoit übersetzen
;IMsRdpClientNonScriptable5 UseMultiSetting = (IMsRdpClientNonScriptable5)rdpClient.GetOcx();
;UseMultiSetting.UseMultimon = true;
;rdpClient.AdvancedSettings.ContainerHandledFullScreen = 1;
$oRDP.Connect()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
$oRDP.Disconnect()
Exit
EndSwitch
If $oRDP.Connected < 1 Then Exit
WEnd
Alles anzeigen