Wie sende ich "Strg+C" an ein bestimmtes CMD / Programm?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von mnemonik.

    Wie sende ich "Strg+C" an ein bestimmtes CMD / Programm?

    Servus Leute,


    vor einige Zeit habe ich euch gefragt, wie man über CMD einem Konsolenprogramm (z.B. youtube-dl, ffmpeg usw.) ein Befehl senden und auslesen kann.
    CMD/ Console während der Eingabeausführung ablesen

    Gerade
    stehe ich wieder auf dem Schlauch und komme nicht weiter. Und zwar, nachdem ich die Arbeit der Konsolenanwendung gestartet habe, möchte ich die Arbeit stoppen. Dafür muss man dasselbe CMD-Fenster finden und "Strg+C" drucken. Ich komme aber nicht drauf, wie das gemacht werden kann.

    Meine Probleme:
    - es wird kein CMD-Fenster erstellt (.CreateNoWindow = True)
    - wie kann ich CMD überhaupt ansprechen wenn ich den Fenster-Title nicht weis (ist von Befehl, OS Sprache, childwindows usw. abhängig)

    P.S.: Wenn der Process gekilled wird, wird die Ausgabedatei beschädigt.
    aber wie soll ich den InputStream wieder umgeleiten? Da ich die Eingabe über Knopfdruck mache, ist die Funktion beendet. Somit verliert sich der Fokus. Weis nicht mehr wie ich den CMD wieder finden und ansprechen soll.


    VB.NET-Quellcode

    1. Shrinker = New Process
    2. With Shrinker.StartInfo
    3. .FileName = "cmd"
    4. .RedirectStandardError = True
    5. .RedirectStandardInput = True
    6. .RedirectStandardOutput = True
    7. .CreateNoWindow = True
    8. .UseShellExecute = False
    9. End With
    10. Shrinker.Start()
    11. Shrinker.StandardInput.WriteLine(" Hier soll der cmd-Code sein ")


    Folgendes funktioniert aber CMD ist immer wärend der Programmabreit zu sehen :(


    VB.NET-Quellcode

    1. Code wie oben...
    2. .CreateNoWindow = False
    3. ...


    und

    VB.NET-Quellcode

    1. Dim MyCMD = Process.GetProcessesByName("cmd")
    2. If MyCMD.Count = 0 Then
    3. Else
    4. SetWindowPos(MyCMD.First.MainWindowHandle, New IntPtr(hWndInsertAfter.BehindTopMost), -1, -1, -1, -1, uFlags.SWP_NOMOVE Or uFlags.SWP_NOSIZE Or uFlags.SWP_SHOWWINDOW)
    5. SendKeys.Send("^{C}")
    6. End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mnemonik“ ()

    mnemonik schrieb:

    SendKeys.Send("^{C}")
    geht an das Fenster mit dem Fokus.
    Entweder Du gibst dem CMF-Fenster den Fokus oder Du sendest per PInvoke.SendMessage().
    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!
    So, ich habe tatsächlich FAST geschafft das Problem zu lösen! "Elegant" kann man die Lösung nicht nennen, aber es funktioniert)

    So sieht mein Code jetzt aus:

    Spoiler anzeigen


    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. '------------------------------------------ Console-Programm im CMD stroppen --------------------------------
    3. If "Bedingung wann das Programm gestoppt wird" Then
    4. 'CMD einblenden
    5. Dim intptrs() As IntPtr = MyCMDProcess.ToArray
    6. For i = 0 To intptrs.Length - 1
    7. If ShowWindow(intptrs(i), ShowWindowCommands.ShowDefault) Then
    8. MyCMDProcess.Remove(intptrs(i))
    9. End If
    10. Next
    11. 'CMD in Vordegrund setzen
    12. Dim MyCMD = Process.GetProcessesByName("cmd")
    13. If MyCMD.Count = 0 Then
    14. Else
    15. SetWindowPos(MyCMD.First.MainWindowHandle, New IntPtr(hWndInsertAfter.BehindTopMost), -1, -1, -1, -1, uFlags.SWP_NOMOVE Or uFlags.SWP_NOSIZE Or uFlags.SWP_SHOWWINDOW)
    16. SendKeys.Send("^{C}")
    17. End If
    18. 'CMD wieder ausblenden
    19. For Each pp As Process In Process.GetProcessesByName("cmd")
    20. If ShowWindow(pp.MainWindowHandle, ShowWindowCommands.Hide) Then
    21. MyCMDProcess.Add(pp.MainWindowHandle)
    22. End If
    23. Next
    24. 'CMD killen
    25. Download_Process.StandardInput.WriteLine("taskkill /im cmd.exe /t /f")
    26. Exit Sub
    27. End If
    28. '------------------------------------------ Hauptprogramm --------------------------------
    29. Download_Process = New Process
    30. With Download_Process.StartInfo
    31. .FileName = "cmd"
    32. .RedirectStandardError = True
    33. .RedirectStandardInput = True
    34. .RedirectStandardOutput = True
    35. .CreateNoWindow = False
    36. .UseShellExecute = False
    37. End With
    38. Download_Process.Start()
    39. Download_Process.StandardInput.WriteLine("CMD Befehl")
    40. Download_Process.StandardInput.WriteLine("exit")
    41. Download_Process.BeginErrorReadLine()
    42. Download_Process.BeginOutputReadLine()
    43. For Each pp As Process In Process.GetProcessesByName("cmd")
    44. If ShowWindow(pp.MainWindowHandle, ShowWindowCommands.Hide) Then
    45. MyCMDProcess.Add(pp.MainWindowHandle)
    46. End If
    47. Next
    48. End Sub
    49. '-------------------------- cmd in Vordergrund (DLL)-----------------------------
    50. <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
    51. Public Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As UInteger) As Boolean
    52. End Function
    53. Enum uFlags As UInteger
    54. SWP_NOMOVE = &H2
    55. SWP_NOSIZE = &H1
    56. SWP_SHOWWINDOW = &H40
    57. End Enum
    58. Enum hWndInsertAfter As Integer
    59. BehindTopMost = -2
    60. End Enum
    61. '-------------------------- cmd ein/ausblenden (DLL)-----------------------------
    62. Private MyCMDProcess As New List(Of IntPtr)
    63. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    64. Private Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As ShowWindowCommands) As Boolean
    65. End Function
    66. Enum ShowWindowCommands As Integer
    67. Hide = 0
    68. ShowDefault = 10
    69. End Enum




    Leider funktioniert das Ausblenden nach dem Start des Programms nur ein Mal, warum auch immer. Womöglich kann mir jemand weiter helfen?
    @mnemonik Wozu genau brauchst Du die Prozedur SetWindowPos()? Mach das alles mit ShowWindow().
    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!
    *unnötiges Zitat entfernt*

    Weil ich nicht wirklich weiß, wie man das macht!) Alle Teile des Codes, die für mich als Amateur Neuland sind, suche ich im Internet und stelle sie 1 zu 1 in mein Programm ein. Da bin ich schon froh, wenn ich den Code-Teil richtig eingebaut habe. :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @mnemonik Dann solltest Du Dir zumindest die Beschreibung von Microsoft ansehen Frau Google: MSDN SetWindowPos, damit Du weißt, worum es geht.
    Nichts ist schlimmer als ein pseudo-eigener Code, von dem man nichts versteht :!:
    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!