以前に NAS に SSH 接続した環境で,文字色などの変更 をやった.
確か DOS 時代に少し使った記憶があるが,コンソール AP で使ってみたいと思い調べてのメモ.
先ず,コマンドプロンプトでの動作から.
echo ^G
‘^G’ の入力は,「Ctrl」+「G」.
「Enter」すると,ブザー(BEL)が鳴る.
今度は,次の様なバイナリデータのファイルを用意しての表示.
それを type で表示する(Linux 環境などでは cat ).
echo を使っての ‘ESC [‘ 入力がわからなかったが,いろいろ試すと「Ctrl」+「[」で入った.
echo ^[[103m
echo ^[[30m
最初わからなかったが,Linux 環境などでは
echo -e “\x1b[103m”
BEL の所に書いてあった.
以前試した時もそうだったと思うが,コマンドプロンプトでそのまま実行してもうまく機能しない.
またその頃はまだメインの開発機は Win7 だったこともありそれ以上は試していなかった.
一度ファイルにリダイレクトして type すると意図した動作になる.
「Windows ESC CSI」で検索すると次の所が見つかる.
コンソールの仮想ターミナル シーケンス
ここを見ると ::SetConsoleMode で ENABLE_VIRTUAL_TERMINAL_PROCESSING を指定するとある.
それで次の様なコードで試すとうまくいった.
#ifdef _WIN32
#ifdef ENABLE_PROCESSED_OUTPUT
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#endif
#endif
#endif
// ...
{
// ...
can_CSI = true ;
#ifdef _WIN32
BOOL can_ESC = FALSE ;
#ifdef ENABLE_PROCESSED_OUTPUT
HANDLE hout = ::GetStdHandle(STD_OUTPUT_HANDLE) ;
DWORD mode = 0 ;
::GetConsoleMode(hout,&mode) ;
mode|= ENABLE_VIRTUAL_TERMINAL_PROCESSING ;
can_ESC = ::SetConsoleMode(hout, mode) ;
#endif
can_CSI = (can_ESC == TRUE) ;
#endif
if (change_bg) {
if (can_CSI) {
std::terr << _T("\x1b[107m") ;
std::terr << _T("\x1b[30m") ;
std::terr << _T("\x1b[0J") ;
// std::terr << _T("\x1b[;H") ;
}
}
// ...
}
CSI.hxx
ちょっとうまくない部分もある?が,何とか.
python だと
from ctypes import windll , wintypes , byref
kernel = windll.kernel32
hout = kernel.GetStdHandle(-11)
mode = wintypes.DWORD()
kernel.GetConsoleMode(hout,byref(mode))
mode.value |= 4
kernel.SetConsoleMode(hout,mode)
print ('\033[96m')
参考にさせてもらったところ.
第3章5 エスケープシーケンスで文字の色、背景の色を変更
2023/03/24
次の様に利用できる.
#include <iostream>
#include "CSI.hxx"
#include "tstring.hxx"
int _tmain (int argc,TCHAR* argv[])
{
CSI csi ;
{
tstring buf ;
buf.resize(1000) ;
std::terr << _T("wait...") ;
std::tin.getline(&buf[0],std::streamsize(buf.size())) ;
}
return 0 ;
}