Alternativer Konsolenhost für Windows 7 / Windows Server 2008

7

Ich bin oft frustriert über die Konsolenhostanwendung von Windows, insbesondere darüber, wie ungeschickt die Zwischenablage funktioniert, Probleme mit der automatischen Breite usw. Ich würde gerne wissen, ob es eine Möglichkeit gibt, den Standardkonsolenhost conhost.exedurch einen benutzerdefinierten zu ersetzen, und wo dies möglich ist Ich finde weitere Informationen zu den Schnittstellen, die ich implementieren müsste, wenn ich meine eigenen schreiben würde.

Ich suche nicht nur eine alternative Konsole, ich benutze sie bereits xtermvon CygWin. Ich suche nach Informationen zum Ersetzen des Windows-Standardkonsolenfensterhosts.


quelle
Siehe auch eine ähnliche Frage zu Windows XP
Gilles 'SO - hör auf böse zu sein'

Antworten:

7

Im Folgenden finden Sie einige nützliche Produkte zum Ersetzen von Konsolen, die benutzerfreundlicher als cmd sind.

Wie unten kommentiert, sind alle diese Shells seit Windows 7 nur eine Schnittstelle zu conhost.exe, sogar zu Powershell. Einzelheiten lesen Was conhost.exe ist und warum ist es Laufen .

Daher ersetzen die folgenden Konsolen nur die standardmäßige visuelle Schnittstelle zu conhost, die von cmd angezeigt wird, und sind nur nützlich, wenn sie direkt als Programme aufgerufen werden. Sie können nicht indirekt aufgerufen werden, wie wenn eine konsolenausführbare Datei wie diskpart ausgeführt wird, da dies conhost aufruft und conhost über eine eigene E / A-Schnittstelle und API verfügt.

Folgendes sagt Microsoft in Windows 7 / Windows Server 2008 R2: Konsolenhost :

ConHost stellt eine permanente Änderung in der Art und Weise dar, wie Konsolenanwendungs-E / A behandelt werden. Es gibt keine Registrierungsschlüssel- oder Gruppenrichtlinieneinstellung, die Windows dazu zwingen könnte, zum Konsolenverhalten im Legacy-Modus zurückzukehren.

Die Schlussfolgerung ist, dass dies nicht möglich ist, wenn Sie die Konsole tiefer ersetzen möchten als die cmd-Schnittstelle. Microsoft hat dieses Design als Sicherheitsmaßnahme ausgewählt und wird nicht zurückkehren.

Die einzige Möglichkeit, das Verhalten von conhost zu ändern, besteht darin, einen globalen System-Hook für die conhost-API festzulegen. Ich weiß überhaupt nicht, ob dies möglich ist und niemand hat es bis jetzt getan (oder ob sie es getan haben, sagen sie es nicht). Ich glaube auch nicht, dass Microsoft Sie eine so wichtige Systemdatei wie conhost.exe durch eine gehackte Version ersetzen lässt.

Wenn das Ersetzen von cmd erforderlich ist, das sich in system32 \ cmd.exe befindet, muss man das Eigentum an der Datei übernehmen und sie dann umbenennen (cmd1.exe?), Die Exe für den Konsolenersatz in cmd.exe umbenennen und zusammen mit system32 kopieren Alle Dateien, die es benötigt, damit es funktioniert. Dies kann zu Problemen führen, wenn die Ersatzkonsole nicht alle Parameter von cmd unterstützt.

Ein anderer Ansatz, der für .bat-Dateien funktioniert, besteht darin, die neue Konsole mit ihnen zu verknüpfen. Dazu muss man den Registrierungsschlüssel bearbeiten HKEY_CLASSES_ROOT\batfile\shell\open\command. In diesem Artikel finden Sie einige Details.

Hier ist die Liste der Konsolen:

Colorconsole
FireCMD
PowerCmd
gs.exe
PyCmd

harrymc
quelle
1
Während alle von ihnen nette Konsolen sind, ersetzt keine von ihnen tatsächlich oder stellt eine Schnittstelle zu ihnen her conhost.exe, so dass Programme in ihnen NICHT standardmäßig gestartet werden.
Siehe meine Bearbeitung oben.
Harrymc
Wie wäre es mit Konsolen-EXEs?
Frage unklar.
Harrymc
1
Sie sind NICHT betroffen von cmd.exe. cmdist nur eine Shell, ein Befehlszeilenprozessor. Das visuelle Konsolenfenster wird von einem ganz anderen Subsystem gesteuert, dh von Prozessen csrss.exevor Vista und von Windows 7 / Windows 2008csrss.execonhost.exe
4

Es gibt Programme wie Console , die sich um cmd.exe drehen und Ihnen wahrscheinlich das geben können, wonach Sie suchen, aber ich habe noch nichts gesehen, das das Konsolensystem ersetzt. AFAIK, die meisten dieser Projekte leiten stdin / stdout / stderr einfach um und wickeln dann eine häufigere GUI um cmd.exe, wobei das eigentliche Konsolenfenster im Hintergrund ausgeblendet wird.

afrazier
quelle
1

Microsoft hat den Quellcode conhost.exe veröffentlicht ( https://github.com/microsoft/terminal ).

Der Konsolenhostcode in diesem Repository ist die eigentliche Quelle, aus der die Datei conhost.exe in Windows selbst erstellt wird.

Jetzt haben Sie die Möglichkeit, die Standard-Datei conhost.exe durch Ihren eigenen Konsolenhost in Windows 10 zu ersetzen. Tatsächlich habe ich bereits einen solchen Versuch unternommen und Erfolg erzielt ( https://github.com/microsoft/terminal/issues/). 1817 ).

Dann sagte Microsoft, dass der Quellcode von OpenConsole von conhost.exe stammt. Können wir dann conhost.exe direkt durch OpenConsole.exe ersetzen? Auf diese Weise erhalten wir einen besseren Standard-Konsolenhost.

Ich habe es versucht und es funktioniert gut. Obwohl OpenConsole als UWP-Anwendung gepackt ist, ist OpenConsole.exe eigentlich ein normales Win32-Fensterprogramm, das durch Doppelklicken auf die Exe ausgeführt werden kann. Sie finden es unter Terminal \ bin \ x64 \ Release \ OpenConsole.exe, wenn Sie einen x64-Release-Build durchgeführt haben.

Gehen Sie dann zu C: \ Windows \ System32, klicken Sie mit der rechten Maustaste auf conhost.exe, "Eigenschaften", und bearbeiten Sie die Berechtigungsliste, um dem aktuellen Benutzer die Berechtigung "Vollzugriff" zu erteilen.

Benennen Sie dann conhost.exe in conhost-old.exe um und kopieren Sie OpenConsole.exe hierher und benennen Sie es in conhost.exe um.

Öffnen Sie eine beliebige Konsolenanwendung (Powershell, WSL, ...) und genießen Sie Ihre neue Konsole.

Es ist auch möglich, OpenConsole-Quellcode auf Windows 7 zu portieren. Da Sie über den Quellcode verfügen, können Sie auch beliebige Funktionen hinzufügen.

Darüber hinaus hat Microsoft in Windows 10 die Windows Pseudo Console-API eingeführt, mit der Entwickler Terminalanwendungen von Drittanbietern eleganter entwickeln können (Ja, sie wird über conhost.exe implementiert und sollte in den von Microsoft veröffentlichten Code aufgenommen werden).

https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/

Hier sind die Dinge, für die conhost.exe tatsächlich verantwortlich ist:

(Von https://devblogs.microsoft.com/commandline/windows-command-line-inside-the-windows-console/ )

Die Kernkomponenten der Konsole bestehen aus folgenden Elementen (von unten nach oben):

  • ConDrv.sys - Kernel-Modus-Treiber

    • Bietet einen leistungsstarken Kommunikationskanal zwischen der Konsole und allen verbundenen Befehlszeilen-Apps
    • Fährt IOCTL-Nachrichten (Ferries IO Control) zwischen Befehlszeilen-Apps und der Konsole, an die sie „angehängt“ sind, hin und her
    • Konsolen-IOCTL-Nachrichten enthalten
      • Daten, die Anforderungen zum Ausführen von API-Aufrufen für die Konsoleninstanz darstellen
      • Von der Konsole an die Befehlszeilen-App gesendeter Text
  • ConHost.exe - Win32 GUI App:

    • ConHost Core - die Einbauten und Leitungen der Konsole

      • API-Server: Konvertiert von Befehlszeilen-Apps empfangene IOCTL-Nachrichten in API-Aufrufe und sendet Textdatensätze von der Konsole an die Befehlszeilen-App
      • API: Implementiert die Win32-Konsolen-API und -Logik hinter allen Vorgängen, zu deren Ausführung die Konsole aufgefordert werden kann
      • Eingabepuffer: Speichert Tastatur- und Mausereignisdatensätze, die durch Benutzereingaben generiert wurden
      • VT-Parser: Wenn diese Option aktiviert ist, werden VT-Sequenzen aus Text analysiert, gefundene aus Text extrahiert und stattdessen entsprechende API-Aufrufe generiert
      • Ausgabepuffer: Speichert den auf dem Display der Konsole angezeigten Text. Im Wesentlichen ein 2D-Array von CHAR_INFO-Strukturen, die die Zeichendaten und Attribute jeder Zelle enthalten (mehr zum Puffer unten).
      • Sonstiges: Nicht in der obigen Abbildung enthalten sind Einstellungen für die Infrastruktur zum Speichern / Abrufen von Werten aus Registrierungs- und / oder Verknüpfungsdateien usw.
    • Console UX App Services - die Konsolen-UX- und UI-Ebene

      • Verwaltet das Layout, die Größe, die Position usw. des Konsolenfensters auf dem Bildschirm
      • Zeigt die Benutzeroberfläche für Einstellungen usw. an und verarbeitet sie.
      • Pumpt die Windows-Nachrichtenwarteschlange, verarbeitet Windows-Nachrichten und übersetzt Benutzereingaben in Schlüssel- und Mausereignisdatensätze, wobei diese im Eingabepuffer gespeichert werden
SwimmingTiger
quelle
0

Wie andere gesagt haben, scheint es, dass man den Konsolenhost nicht einfach als solchen ersetzen kann. Es gibt ein anderes Projekt, das Tricks verwendet, um die Conhost-Benutzeroberfläche auszublenden und eine eigene zu zeigen, die noch nicht erwähnt wurde: ConEmu .

Da Conhost nicht vollständig ersetzt wird, müssen Sie das Zielprogramm über ConEmu ausführen, damit dies wirksam wird. Wenn Sie einfach ein Konsolenprogramm über das Fenster "Ausführen" ausführen, wird weiterhin die Conhost-Benutzeroberfläche angezeigt.

RomanSt
quelle
-1

Ich würde empfehlen, entweder PowerShell zu installieren , eine Microsoft-Version eines Unix-Terminals, das für Skripte, Piping usw. vorgesehen ist, oder Microsoft Services für Unix (einst als SFU bekannt), ein vollständiges Posix-Subsystem für Windows, das direkt darauf ausgeführt wird Der Kernel (dh neben WIN32 und der Windows-API, nicht darüber. Wiederum, dh er ist nicht emuliert, es ist im Grunde Unix) und ermöglicht es Ihnen, alle (naja, die meisten) * nix-Technologien und -Shells zu verwenden. Es ist eine echte Schande, dass Services für Unix nicht mehr an Zugkraft gewonnen hat.

Mahmoud Al-Qudsi
quelle
1
Ich habe PowerShell verwendet, aber dies hat nichts mit dem Konsolenhost unter Windows zu tun. IIRC, PowerShell verwendet denselben Konsolenhost mit all seinen Einschränkungen (der einzige Unterschied ist der blaue Hintergrund). Außerdem möchte ich den Konsolenhost für alle Konsolenanwendungen ändern, nicht nur für die Shell meiner Wahl.
Ja. SFU wird genau das tun, was Sie wollen, aber andererseits ersetzt es viel mehr als conhost.exe
Mahmoud Al-Qudsi
Ich habe CygWin verwendet und das xterm/ bashdas mitgeliefert wurde ist großartig, ich benutze es die ganze Zeit. Ich habe immer noch Konsolenanwendungen, die für Win32 geschrieben sind und auf dem Standard-Konsolenhost ausgeführt werden, wenn ich sie nicht ausführe bash. Ich würde gerne wissen, ob es möglich ist, diese windws-Komponente zu ersetzen.