Windows 7/Windows Server 2008용 대체 콘솔 호스트

Windows 7/Windows Server 2008용 대체 콘솔 호스트

나는 종종 Windows 콘솔 호스트 응용 프로그램, 특히 클립보드가 얼마나 서투르게 작동하는지, 자동 너비가 없는 문제 등으로 인해 좌절감을 느낍니다. 기본 콘솔 호스트를 사용자 정의 콘솔 호스트로 교체할 수 있는 방법이 있는지 conhost.exe, 어디에서 할 수 있는지 알고 싶습니다. 내가 직접 작성하려면 구현해야 할 인터페이스에 대한 자세한 정보를 찾습니다.

나는 대체 콘솔을 찾고 있는 것이 아니라 이미 xtermCygWin에서 사용하고 있습니다. 방법에 대한 정보를 찾고 있습니다.바꾸다Windows의 기본 콘솔 창 호스트.

답변1

다음은 cmd보다 사용자 친화적인 멋진 콘솔 대체 제품입니다.

아래 설명과 같이 Windows 7부터 이러한 모든 셸은 conhost.exe, 심지어 powershell에 대한 인터페이스일 뿐입니다. 자세한 내용은 다음을 읽어보세요.conhost.exe 란 무엇이며 왜 실행되고 있습니까?.

따라서 아래 콘솔은 cmd가 표시하는 conhost의 기본 시각적 인터페이스만 대체하며 프로그램으로 직접 호출할 때만 유용합니다. diskpart와 같은 콘솔 실행 파일이 실행될 때처럼 간접적으로 호출할 수 없습니다. 이렇게 하면 conhost가 호출되고 conhost에는 자체 I/O 인터페이스와 API가 있기 때문입니다.

Microsoft가 말하는 내용은 다음과 같습니다.Windows 7/Windows Server 2008 R2: 콘솔 호스트:

ConHost는 콘솔 애플리케이션 I/O가 처리되는 방식의 영구적인 변경을 나타냅니다. Windows를 강제로 "레거시 모드" 콘솔 동작으로 되돌릴 수 있는 레지스트리 키나 그룹 정책 설정은 없습니다.

결론은 cmd 인터페이스를 교체하는 것보다 더 깊은 방법으로 콘솔을 교체하려는 경우에는 불가능하다는 것입니다. Microsoft는 보안 조치로 이 디자인을 선택했으며 다시는 돌아가지 않을 것입니다.

conhost의 작동 방식을 변경하려고 생각할 수 있는 유일한 방법은 conhost API에 전역 시스템 후크를 설정하는 것입니다. 이것이 가능한지 전혀 모르겠고 지금까지 아무도 그것을 해본 적이 없습니다(또는 그들이 했다면 그들은 말하지 않았습니다). 또한 Microsoft가 conhost.exe와 같이 매우 중요한 시스템 파일을 해킹된 버전으로 교체하도록 허용할 것이라고는 생각하지 않습니다.

system32\cmd.exe에 있는 cmd를 교체해야 하는 경우 파일의 소유권을 가져온 다음 이름을 바꾸고(cmd1.exe?) 콘솔 교체 exe의 이름을 cmd.exe로 바꾸고 다음과 함께 system32에 복사해야 합니다. 작동하는 데 필요한 모든 파일. 교체 콘솔이 cmd가 지원하는 모든 매개변수를 지원하지 않는 경우 문제가 발생할 수 있습니다.

.bat 파일에 적용되는 또 다른 접근 방식은 새 콘솔을 해당 파일과 연결하는 것입니다. 이를 위해서는 레지스트리 키를 편집해야 합니다 HKEY_CLASSES_ROOT\batfile\shell\open\command. 이것 좀 봐기사자세한 내용은.

콘솔 목록은 다음과 같습니다.

컬러콘솔
FireCMD
전원 명령
GS.EXE
PyCmd

답변2

와 같은 프로그램이 있어요콘솔이는 cmd.exe를 둘러싸서 여러분이 찾고 있는 것을 제공할 수 있지만 콘솔 시스템을 완전히 대체하는 것은 본 적이 없습니다. AFAIK, 이러한 종류의 프로젝트 대부분은 단순히 stdin/stdout/stderr를 리디렉션한 다음 cmd.exe 주위에 보다 일반적인 GUI를 래핑하여 실제 콘솔 창을 백그라운드에 숨깁니다.

답변3

Microsoft는 conhost.exe 소스 코드를 공개했습니다(https://github.com/microsoft/terminal).

이 저장소의 콘솔 호스트 코드는 Windows 자체의 conhost.exe가 빌드되는 실제 소스입니다.

이제 기본 conhost.exe를 Windows 10의 자체 콘솔 호스트로 바꿀 수 있는 기회가 생겼습니다. 실제로 저는 이미 그러한 시도를 했고 성공을 거두었습니다(https://github.com/microsoft/terminal/issues/1817).

그러면 Microsoft에서는 OpenConsole의 소스 코드가 conhost.exe에서 나온다고 했는데, conhost.exe를 OpenConsole.exe로 직접 대체할 수 있을까요? 이렇게 하면 더 나은 기본 콘솔 호스트를 얻을 수 있습니다.

나는 그것을 시도했고 잘 작동합니다. OpenConsole은 UWP 응용 프로그램으로 패키지되어 있지만 OpenConsole.exe는 실제로 해당 exe를 두 번 클릭하여 실행할 수 있는 일반적인 Win32 창 프로그램입니다. x64 릴리스 빌드를 완료한 경우 터미널\bin\x64\Release\OpenConsole.exe에서 찾을 수 있습니다.

그런 다음 C:\Windows\System32로 이동하여 conhost.exe, "속성"을 마우스 오른쪽 버튼으로 클릭하고 권한 목록을 편집하여 현재 사용자에게 "모든 권한" 권한을 부여합니다.

그런 다음 conhost.exe의 이름을 conhost-old.exe로 바꾸고 OpenConsole.exe를 여기에 복사하여 conhost.exe로 이름을 바꿉니다.

콘솔 애플리케이션(powershell, wsl 등)을 열고 새 콘솔을 즐겨보세요.

OpenConsole 소스 코드를 Windows 7로 포팅하는 것도 가능합니다. 또한, 소스 코드가 있기 때문에 원하는 기능을 추가할 수 있습니다.

또한 Microsoft는 Windows 10에 Windows Pseudo Console API를 도입하여 개발자가 타사 터미널 응용 프로그램을 보다 우아하게 개발할 수 있도록 했습니다(예, conhost.exe를 통해 구현되며 Microsoft에서 릴리스한 코드에 포함되어야 합니다).

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

conhost.exe가 실제로 담당하는 작업은 다음과 같습니다.

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

콘솔의 핵심 구성 요소는 다음과 같이 구성됩니다(상향식).

  • ConDrv.sys – 커널 모드 드라이버

    • 콘솔과 연결된 모든 명령줄 앱 간의 고성능 통신 채널을 제공합니다.
    • 명령줄 앱과 해당 앱이 "연결된" 콘솔 사이를 오가는 IOCTL(Ferry IO Control) 메시지
    • 콘솔 IOCTL 메시지에는 다음이 포함됩니다.
      • 콘솔 인스턴스에 대한 API 호출 실행 요청을 나타내는 데이터
      • 콘솔에서 명령줄 앱으로 전송되는 텍스트
  • ConHost.exe – Win32 GUI 앱:

    • ConHost Core – 콘솔의 내부 및 배관

      • API 서버: 명령줄 앱에서 받은 IOCTL 메시지를 API 호출로 변환하고 콘솔에서 명령줄 앱으로 텍스트 레코드를 보냅니다.
      • API: 콘솔이 수행하도록 요청할 수 있는 모든 작업 뒤에 Win32 콘솔 API 및 논리를 구현합니다.
      • 입력 버퍼: 사용자 입력에 의해 생성된 키보드 및 마우스 이벤트 기록을 저장합니다.
      • VT Parser: 활성화된 경우 텍스트에서 VT 시퀀스를 구문 분석하고 텍스트에서 찾은 항목을 추출하며 대신 동등한 API 호출을 생성합니다.
      • 출력 버퍼: 콘솔 디스플레이에 표시된 텍스트를 저장합니다. 기본적으로 각 셀의 문자 데이터 및 속성을 포함하는 CHAR_INFO 구조체의 2D 배열입니다(아래 버퍼에 대한 자세한 내용)
      • 기타: 위 다이어그램에는 레지스트리 및/또는 바로가기 파일 등에서 값을 저장/검색하는 설정 인프라가 포함되지 않습니다.
    • 콘솔 UX 앱 서비스 – 콘솔 UX 및 UI 계층

      • 화면상 콘솔 창의 레이아웃, 크기, 위치 등을 관리합니다.
      • 설정 UI 등을 표시하고 처리합니다.
      • Windows 메시지 대기열을 펌핑하고, Windows 메시지를 처리하고, 사용자 입력을 키 및 마우스 이벤트 기록으로 변환하여 입력 버퍼에 저장합니다.

답변4

둘 중 하나를 설치하는 것이 좋습니다.파워셸, 이는 스크립팅, 파이핑 등을 위한 Microsoft 버전의 Unix 터미널입니다.Unix용 Microsoft 서비스(한때 SFU로 알려져 있음) 이는 실제로 Windows용 전체 Posix 하위 시스템으로 커널 위에서 직접 작동합니다(즉, WIN32 및 Windows API와 함께 작동하며 그 위에 있지 않습니다. 즉, 에뮬레이션되지 않으며 기본적으로 Unix입니다). *nix 기술과 쉘을 (대부분의) 사용할 수 있습니다. Unix용 서비스가 더 이상 관심을 끌지 못하는 것은 정말 부끄러운 일입니다.

관련 정보