cmd Problem für VR Brillen Projekt

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    cmd Problem für VR Brillen Projekt

    Hallo,

    aktuell arbeite ich an einem kleinen Privaten VR Projekt. Ziel dieses Projektes ist zu testen ob VR auch für die Arbeit genutzt werden kann. D.h nicht nur in der Konstruktion oder 3D Visualisierung, sondern auch andere Bereiche, also auch IT, Verwaltung etc.!
    Hierfür nutze ich aktuell vorhandene Programme Windows Mixed Reality, Steam, Desktop+(Steam), Virtual Desktop(Steam).

    Desktop+ und Virtual Desktop unterscheiden sich in der Anwendung. Deshalb nutze ich Virtual Desktop zum Zocken(bessere Performance) und Desktop+ für die Arbeit(Programmieren und konstruieren etc.).

    Jetzt möchte ich die ganzen Prozesse die ich manuell starte automatisieren, insbesondere das Aktivieren der Virtuellen Monitore.
    Hierzu habe ich diese Treiber heruntergeladen und Installiert. Ist bei dem dazugehörigen tutorial bei dem Youtube Video.

    youtube.com/watch?v=ybHKFZjSkVY

    Hierzu habe ich mir 2 cmd's gebastelt um diese, je nach anwendungsfall zu starten:

    Quellcode: Games.cmd

    1. @cd /d "%~dp0"
    2. @goto %PROCESSOR_ARCHITECTURE%
    3. @exit
    4. :AMD64
    5. @cmd /c Pfad zu Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe install G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\usbmmidd.inf usbmmidd
    6. @cmd /c Pfad zu Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe enableidd 1
    7. @goto end
    8. :end
    9. @pause


    Quellcode: Arbeit.cmd

    1. @cd /d "%~dp0"
    2. @goto %PROCESSOR_ARCHITECTURE%
    3. @exit:
    4. AMD64
    5. @cmd /c Pfad zu Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe install G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\usbmmidd.inf usbmmidd
    6. @cmd /c Pfad zu Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe enableidd 1
    7. @cmd /c Pfad zu Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe enableidd 1
    8. @cmd /c Pfad zu Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe enableidd 1
    9. @cmd /c Pfad zu Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe enableidd 1
    10. @goto end
    11. :end
    12. @pause


    Der Unterschied ist das Spielen nur einen Monitor erstellt und Arbeit 4 Monitore(Anzahl soll Später noch ausgewählt werden).

    Danach stelle ich je nach bedarf die Auflösung der Virtuellen Monitore ein. Für Spielen 4K und für die Arbeit sollen die Monitore auf 1920x1080 eingestellt werden(auch das soll änderbar sein).

    Die Einstellung der Monitore konnte ich schon Automatisieren, jedoch das Abarbeiten der CMD's bereitet mir irrsinnige Probleme. Da die Virtuellen Monitore über mein Programm nicht angelegt bzw. Installiert werden können.

    Anbei mein kpl. Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Windows.Forms
    3. Imports System.Drawing
    4. Imports System.Runtime.InteropServices
    5. Class MainWindow
    6. <DllImport("user32.dll")>
    7. Private Shared Function EnumDisplayDevices(ByVal Unused As Integer,
    8. ByVal iDevNum As Integer, ByRef lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Integer) As Integer
    9. End Function
    10. 'This function retrieves information about one of the graphics modes for a display device
    11. <DllImport("user32.dll")>
    12. Private Shared Function EnumDisplaySettings(ByVal lpszDeviceName As String,
    13. ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
    14. End Function
    15. 'The ChangeDisplaySettingsEx function changes the settings of the specified display device to the specified graphics mode
    16. <DllImport("user32.dll")>
    17. Private Shared Function ChangeDisplaySettingsEx(ByVal lpszDeviceName As String,
    18. ByRef lpDevMode As DEVMODE, ByVal hWnd As Integer, ByVal dwFlags As Integer,
    19. ByVal lParam As Integer) As Integer
    20. End Function
    21. Private Const CCDEVICENAME As Short = 32
    22. Private Const CCFORMNAME As Short = 32
    23. Private Const DM_BITSPERPEL = &H40000
    24. Private Const DM_PELSWIDTH = &H80000
    25. Private Const DM_PELSHEIGHT = &H100000
    26. Private Const CDS_UPDATEREGISTRY = &H1
    27. Private Const DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = &H1 'Display Device Attached To Desktop Device
    28. Private Const DISPLAY_PRIMARY_DEVICE = &H4 'Primary Display Device
    29. Private Structure DISPLAY_DEVICE
    30. Public cb As Integer
    31. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)>
    32. Public DeviceName As String
    33. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)>
    34. Public DeviceString As String
    35. Public StateFlags As Short
    36. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)>
    37. Public DeviceID As String
    38. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)>
    39. Public DeviceKey As String
    40. End Structure
    41. Private Structure DEVMODE
    42. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)>
    43. Public dmDeviceName As String
    44. Public dmSpecVersion As Short
    45. Public dmDriverVersion As Short
    46. Public dmSize As Short
    47. Public dmDriverExtra As Short
    48. Public dmFields As Integer
    49. Public dmOrientation As Short
    50. Public dmPaperSize As Short
    51. Public dmPaperLength As Short
    52. Public dmPaperWidth As Short
    53. Public dmScale As Short
    54. Public dmCopies As Short
    55. Public dmDefaultSource As Short
    56. Public dmPrintQuality As Short
    57. Public dmColor As Short
    58. Public dmDuplex As Short
    59. Public dmYResolution As Short
    60. Public dmTTOption As Short
    61. Public dmCollate As Short
    62. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)>
    63. Public dmFormName As String
    64. Public dmLogPixels As Short
    65. Public dmBitsPerPel As Short
    66. Public dmPelsWidth As Integer
    67. Public dmPelsHeight As Integer
    68. Public dmDisplayFlags As Integer
    69. Public dmDisplayFrequency As Integer
    70. Public dmICMMethod As Integer
    71. Public dmICMIntent As Integer
    72. Public dmMediaType As Integer
    73. Public dmDitherType As Integer
    74. Public dmReserved1 As Integer
    75. Public dmReserved2 As Integer
    76. Public dmPanningWidth As Integer
    77. Public dmPanningHeight As Integer
    78. End Structure
    79. Public Sub New()
    80. InitializeComponent()
    81. End Sub
    82. Private Function Removecmd() As String
    83. Dim tempcmd As String
    84. tempcmd = "@cmd /c G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe stop usbmmidd"
    85. tempcmd = tempcmd & vbNewLine & "End"
    86. tempcmd = tempcmd & vbNewLine & "Pause"
    87. Return tempcmd
    88. End Function
    89. Private Function AddGameDisplaycmd() As String
    90. Dim tempcmd As String
    91. tempcmd = "@cmd /c G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe install G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\usbmmidd.inf usbmmidd"
    92. tempcmd = tempcmd & vbNewLine & "@cmd /c G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe enableidd 1"
    93. tempcmd = tempcmd & vbNewLine & "End"
    94. tempcmd = tempcmd & vbNewLine & "Pause"
    95. Return tempcmd
    96. End Function
    97. Private Sub Game_BTN_Click(sender As Object, e As RoutedEventArgs)
    98. 'RunCommandCom(Removecmd)
    99. RunCommandCom(AddGameDisplaycmd)
    100. 'StartProcessasAdmin("G:\Windows_Profiles\Users\Zeljko\Desktop\Spielen.cmd")
    101. System.Threading.Thread.Sleep(5000)
    102. ChangeResulution(3840, 2160)
    103. 'Process.Start("G:\Windows_Profiles\Users\Zeljko\Desktop\Virtual Desktop.url")
    104. End Sub
    105. Private Sub RunCommandCom(ByVal command As String)
    106. Dim p As Process = New Process()
    107. Dim pi As ProcessStartInfo = New ProcessStartInfo()
    108. pi.Arguments = command
    109. pi.FileName = "cmd.exe"
    110. pi.Verb = "runas"
    111. p.StartInfo = pi
    112. p.Start()
    113. End Sub
    114. Private Sub Work_BTN_Click(sender As Object, e As RoutedEventArgs)
    115. Process.Start("G:\Windows_Profiles\Users\Zeljko\Desktop\Remove.bat")
    116. Process.Start("G:\Windows_Profiles\Users\Zeljko\Desktop\Arbeit.bat")
    117. ChangeResulution(1920, 1080)
    118. Process.Start("G:\Windows_Profiles\Users\Zeljko\Desktop\Desktop+.url")
    119. End Sub
    120. Private Sub ChangeResulution(ByVal DP_Width As Integer, ByVal DP_Height As Integer)
    121. Dim dmCurrResolution As DEVMODE 'Create Resolution Object
    122. Dim dmResolutions() As DEVMODE 'Create Resolution Array Because There Will Be More Than One Screen
    123. Dim ddCurrDisplay As DISPLAY_DEVICE 'Create DisplayDevice Object
    124. Dim ddDevices() As DISPLAY_DEVICE 'Create Display Device Array Because There Will Be More Than One Screen
    125. Dim intResult As Integer = 1 'Result Of EnumDisplayDevices API Call
    126. Dim sMonitors As Integer 'How Many Monitors?
    127. 'Loop Through All Available Monitors And get Their Current Settings
    128. Do While intResult <> 0 'Do While There Are Monitors
    129. ddCurrDisplay.cb = Marshal.SizeOf(ddCurrDisplay) 'Initialize Current Display Object
    130. dmCurrResolution.dmSize = CShort(Marshal.SizeOf(dmCurrResolution)) 'get Size
    131. intResult = EnumDisplayDevices(0, sMonitors, ddCurrDisplay, 0) 'Determine Number Of Monitors
    132. 'Determine How Monitors Are Connected To System
    133. If ddCurrDisplay.StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Or
    134. ddCurrDisplay.StateFlags = DISPLAY_PRIMARY_DEVICE Or
    135. ddCurrDisplay.StateFlags = (DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Or DISPLAY_PRIMARY_DEVICE) Then
    136. ReDim Preserve ddDevices(sMonitors) 'Allocate Space For Each Monitor In Array
    137. ddDevices(sMonitors) = ddCurrDisplay 'Store Their Settings
    138. End If
    139. sMonitors += 1 'Increment
    140. Loop
    141. 'Loop Through All Monitors And Set Resolution
    142. For sMonitors = 0 To UBound(ddDevices)
    143. Debug.Print(ddDevices(sMonitors).DeviceString & "- " & ddDevices(sMonitors).DeviceName)
    144. ReDim Preserve dmResolutions(sMonitors)
    145. If ddDevices(sMonitors).DeviceString = "USB Mobile Monitor Virtual Display" Then
    146. 'Determine Size
    147. dmResolutions(sMonitors).dmSize = CShort(Marshal.SizeOf(dmResolutions(sMonitors)))
    148. dmResolutions(sMonitors).dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL 'Get Settings
    149. dmResolutions(sMonitors).dmPelsWidth = DP_Width 'Change X
    150. dmResolutions(sMonitors).dmPelsHeight = DP_Height 'Change Y
    151. dmResolutions(sMonitors).dmBitsPerPel = 32 ' Use Correct BPP Setting, Could Be 8, 16, 32 Or 4
    152. 'Change
    153. intResult = ChangeDisplaySettingsEx(ddDevices(sMonitors).DeviceName, dmResolutions(sMonitors), 0, CDS_UPDATEREGISTRY, 0)
    154. If intResult = -1 Then 'Error Thrown
    155. MessageBox.Show("Invalid Setting")
    156. End If
    157. End If
    158. Next
    159. End Sub
    160. End Class



    Ich hatte erst versucht über process.start direkt die cmd's aufzurufen, jedoch hat das auch nicht geholfen deshalb habe ich das dann versucht direkt im Programm zu verarbeiten.

    Code-Tags eingefügt. Spoiler-Tag eingefügt. (Der Code ist doch recht lang, da kann man den schon mal spendieren ;) ) Thunderbolt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    Rattenfänger schrieb:

    Ich hatte erst versucht über process.start direkt die cmd's aufzurufen
    Erstell Dir Process-Instanzen mit New Process() und gib ihnen das Arbeitsverzeichnis mit, in dem die Programme laufen sollen:
    ProcessStartInfo.WorkingDirectory
    learn.microsoft.com/de-de/dotn…ingdirectory?view=net-6.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany,

    leider hat das nichts geholfen, die Fehlermeldung erscheint(siehe Bild).

    Er cutet mir den Befehl nach "usbmmidd.inf" und erstellt da einen Punkt !?!

    Jedoch lautet die Befehlszeile ja komplett:

    @cmd /c G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\deviceinstaller64.exe install G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\usbmmidd.inf usbmmidd

    anbei mein geänderter Code(zumindest die geänderten Funktionen/Prozeduren):

    VB.NET-Quellcode

    1. Private Sub RunCommandCom(ByVal command As String)
    2. Dim p As Process = New Process()
    3. Dim pi As ProcessStartInfo = New ProcessStartInfo()
    4. pi.Arguments = command
    5. pi.WorkingDirectory = "G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2"
    6. pi.FileName = "cmd.exe"
    7. pi.Verb = "runas"
    8. p.StartInfo = pi
    9. p.Start()
    10. End Sub
    11. Private Function AddGameDisplaycmd() As String
    12. Dim tempcmd As String
    13. tempcmd = "@cmd /c deviceinstaller64.exe install usbmmidd.inf usbmmidd"
    14. tempcmd = tempcmd & vbNewLine & "@cmd /c deviceinstaller64.exe enableidd 1"
    15. tempcmd = tempcmd & vbNewLine & "End"
    16. tempcmd = tempcmd & vbNewLine & "Pause"
    17. Return tempcmd
    18. End Function
    Bilder
    • Unbenannt.PNG

      51,84 kB, 1.257×696, 56 mal angesehen
    @Rattenfänger Was passierst, wenn Du die Batch-Datei vom Explorer aus ausführst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Rattenfänger Dann schreibe die CMD und starte sie im dem richtigen WorkingDirectory.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    1.) war ein Fehler drin. Er hat mir jedesmal einen neuen Treiber installiert. Den Fehler habe ich beseitigt!
    2.) Funktioniert es dennoch nicht nach der korrektur. Weder als *.bat oder *.cmd

    Es erscheint kurz die Kommando Konsole und das wars.

    VB.NET-Quellcode

    1. Private Sub RunCommandCom(ByVal command As String)
    2. Dim p As Process = New Process()
    3. Dim pi As ProcessStartInfo = New ProcessStartInfo()
    4. 'pi.Arguments = command
    5. pi.WorkingDirectory = "G:\Windows_Profiles\Users\Zeljko\Downloads\System\Virtueller_Monitor\usbmmidd_v2\"
    6. pi.FileName = "Spielen.bat"
    7. pi.Verb = "runas"
    8. p.StartInfo = pi
    9. p.Start()
    10. End Sub
    11. Private Function AddGameDisplaycmd() As String
    12. Dim tempcmd As String
    13. 'tempcmd = "@cmd /c deviceinstaller64.exe install usbmmidd.inf usbmmidd"
    14. tempcmd = "@cmd /c deviceinstaller64.exe enableidd 1"
    15. tempcmd = tempcmd & vbNewLine & "End"
    16. tempcmd = tempcmd & vbNewLine & "Pause"
    17. Return tempcmd
    18. End Function




    Habe es auch mal wieder als normaler User gestartet, da win10 user und Admin seperat hält. Also Ebene des Admins ist komplett anders.
    @Rattenfänger Bring die CMD zum Laufen.
    Danach portierst Du das ganze nach VB.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn, dann gleich

    Quellcode

    1. tempcmd = """@cmd /c deviceinstaller64.exe enableidd 1"""
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    also die cmd, lässt sich jetzt aus vb.net heraus starten. hier musste ich die cmd, bis auf eine zeile kürzen.

    deviceinstaller64.exe enableidd 1

    habe das natürlich gleich auch so in vb versucht, ging natürlich nicht :/ .

    im schlimmsten fall werde ich die cmd(Datei), im installationsordner mit einbauen. Das ist für den Anfang erstmal nicht schlimm.