RDP-ActiveX-Control mit multimonitor-Unterstützung - 150€

  • 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:

    Einmal editiert, zuletzt von card0384 (9. Juli 2015 um 14:29)

    • Offizieller Beitrag

    @card0384, unterlasse bitte in Zukunft, eine Thread in einem anderen Unterforum doppelt zu erstellen, um zu pushen.
    Wer dir helfen will, wird das auch tun und aufdringliches Doppelposting wird das nicht beschleunigen.
    Ich habe den anderen Thread entsorgt.

  • Alles klar, mach ich... :saint:

    haste denn eine Idee, wie ich das "IMsRdpClientNonScriptable5 Interface" mittels Überrsetzung ins Autoit einbinden kann? So soll es wohl gehen, aber ich hab keinen Plan, wie ich aus dem Active-X-Objekt auf das ocx-Objekt komme - das müsste dann wohl irgendwie so gehen: $oRDP.GetOcx() - hier fehlt mir die Idee, wie ich den Text in Klammern "(IMsRdpClientNonScriptable5)" behandlen muss und wie ich "IMsRdpClientNonScriptable5 UseMultiSetting" übersetze. Das "UseMultiSetting" wird die neue Variable sein, aber das "IMsRdpClientNonScriptable5 " davor gibt mir Rätsel auf. Ob das Ganze mit einem DLL-Call behandelt werden muss?
    Hier nochmal vermutlich der Teil, der meiner Meinung nach des Rätsels Lösung sein könnte:
    IMsRdpClientNonScriptable5 UseMultiSetting = (IMsRdpClientNonScriptable5)rdpClient.GetOcx();
    UseMultiSetting.UseMultimon = true;

  • Nachdem ich es selbst nicht ausprobieren kann ist es etwas schwieig, aber vielleicht könnte das hier helfen:

    [autoit]

    DllCall("Mstscax.dll", "BOOLEAN", "put_UseMultimon", "VARIANT_TRUE")

    [/autoit]

    Zu dem Vollbild hab ich keine Referenzen gefunden, d.h. ich weiß nicht wie das umsetzbart ist ich schau aber morgen nochmal explizit nach.

    Philipp

  • Hi Phil-IT,

    danke für deinen Ansatz, haste noch eine Idee, wie ich den DLL-Call mit meinem $oRDP-Objekt verbinde? Dem Objekt liegt ja schlussendlich mit Sicherheit eine Instanz der Funktionen aus Mstscax.dll zugrunde. Nur wie kann ich aus dem $oRDP-Objekt auf die dll-Instanz zugreifen?

  • Soweit ich weis brauchst du für einen DLL-Call keine Referenz zu einem Handle (deine Instanz denke ich oder?). Also versuche einfach mal die Zeile an Den Anfang des Scripts zu setzen; ich dachte nämlich eigentlich dass der DLL-Call den ich dir geschrieben hab ein statischer Aufruf einer Funktion ist, die einfach einen Wert im System ändert. Falls ich mich da sehr täusche bitte hilf mir:D

  • HI Phil-IT,

    sorry für die späte Antwort, war gebunden in anderen Projekten - jetzt geht's aber weiter.

    Dein DLL-Call bringt leider keine Wirkung, ich habe auch verschiedene getestet - entweder nicht die richtige gefunden oder k.A. woran es liege könnte.
    Fakt ist, der DLL-Call sollte doch ein Array zurückgeben - mit _arrayDisplay kommt aber nichts zurück - Die Rückgabe als MsgBox liefert "0".

    Irgendwas klappt da nicht...

    Kann es sein, das die GUI $guirdp bereits multimonitorunterstützung benötigt? Denn $oRDP.DesktopWidth = 4096 veranlasst zwar, das die RDP-Oberfläche 4096 Pixel breit wird, aber die Anzeige erfolgt nur auf dem Primärmonitor mit Scrollbalken um in die andere Hälfte scrollen zu können.

    Einmal editiert, zuletzt von card0384 (9. Juli 2015 um 15:26)

  • ich weiß nicht, wer das Thema als erledigt markiert hat, ich war es jedenfalls nicht - die Gegenleistung steht immer noch zur Übergabe bereit für den der die Lösung hat - Danke