CreateScreenConsoleBuffer新規コンソールバッファの作成

Cの宣言:

HANDLE CreateConsoleScreenBuffer(
	DWORD AccessFlags,
	DWORD ShareMode,
	LPSECURITY_ATTRIBUTES Security,
	DWORD BufType,
	PVOID Reserved);

セキュリティ属性の指定をしない場合のVBの宣言:

Declare Function CreateConsoleScreenBuffer Lib "kernel32" ( _
	ByVal AccessFlags As Long, _
	ByVal ShareMode As Long, _
	ByVal Securiy As Long, _
	ByVal BufType As Long, _
	ByVal Reserved As Long) As Long

セキュリティ属性の指定を行う場合のVBの宣言:

Declare Function CreateConsoleScreenBuffer Lib "kernel32" ( _
	ByVal AccessFlags As Long, _
	ByVal ShareMode As Long, _
	ByRef Securiy As SECURITY_ATTRIBUTES, _
	ByVal BufType As Long, _
	ByVal Reserved As Long) As Long

説明:

新規コンソールバッファを作成し、そのハンドルを返す。返されたハンドルに対してReadFile、WriteFile、ReadConsole、WriteConsoleなどの関数を実行することができる。

作成したコンソールバッファは、SetConsoleActiveScreenBuffer関数によってアクティブなコンソールバッファにしない限りコンソールウィンドウには表示されない。

作成するコンソールバッファの属性は、AccessFlags、ShareModeなどのフラグによって指定する。AccessFlagsは、CreateConsoleScreenBuffer関数の返すハンドルに対して、読み込みが可能か、書き込みが可能かなどの指定を行う。ShareModeは、OpenFile関数などによって読み込みモードで作成したコンソールを開くことが可能か、書き込みモードでコンソールを開くことが可能かなどの指定を行う。BufTypeには、常にCONSOLE_TEXTMODE_BUFFERを指定しなければならない。BufTypeを例えば0とした場合、ERROR_INVALID_DATAエラーが発生するだろう。

AccessFlagsにGENERIC_WRITEを指定しなかった場合、SetConsoleActiveScreenBuffer関数は失敗する。

引数の意味は、以下の通り。
AccessFlags 新規コンソールバッファのアクセス方式を指定するフラグ。備考を参照。
ShareMode 共有モードを指定するフラグ。後述の表を参照。
Security 新規コンソールバッファのセキュリティ属性。NULLを指定可能。
BufType 新規コンソールバッファに関するフラグ。後述の表を参照。
Reserved NULLでなければならない。

AccessFlagsは、以下のフラグの論理和である。
GENERIC_READ 返されるハンドルによってバッファからの読み込みが可能。
GENERIC_WRITE 返されるハンドルによってバッファからの書き込みが可能。

ShareModeは、以下のフラグの論理和である。
FILE_SHARE_READ 作成結果のコンソールバッファを、他のAPI関数により読み込みモードでオープン可能。
FILE_SHARE_WRITE 作成結果のコンソールバッファを、他のAPI関数により書き込みモードでオープン可能。

BufTypeは、以下のフラグのみ指定可能。
CONSOLE_TEXTMODE_BUFFER テキストモードのコンソールバッファを作成する。

戻り値は、作成結果の新規コンソールバッファのハンドル。関数の実行に失敗した場合、INVALID_HANDLE_VALUEが返される。

Cのサンプル:

void DoCreateCon()
{
	HANDLE hCon1, hCon2;
	char *msg1 = "現在アクティブなコンソールは1番目のコンソールです。\n";
	char *msg2 = "現在アクティブなコンソールは2番目のコンソールです。\n";

	DWORD cbWriten;

	hCon1 = CreateFile(
		"CONOUT$",
		GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		0,
		NULL);

	hCon2 = CreateConsoleScreenBuffer(
		GENERIC_WRITE,
		0,
		NULL,
		CONSOLE_TEXTMODE_BUFFER,
		NULL);

	WriteConsole(hCon1, msg1, lstrlen(msg1), &cbWriten, NULL);
	WriteConsole(hCon2, msg2, lstrlen(msg2), &cbWriten, NULL);

	Sleep(3000);
	SetConsoleActiveScreenBuffer(hCon2);

	Sleep(3000);
	SetConsoleActiveScreenBuffer(hCon1);

	CloseHandle(hCon1);
	CloseHandle(hCon2);

}

VBのサンプル:

二つのコンソールバッファを作成し、順に切り替えてコンソールウィンドウに表示する。
Private Sub DoCreateCon()

	Dim hCon1 As Long
	Dim hCon2 As Long
	Dim Msg1 As String
	Dim Msg2 As String
	Dim WriteNum As Long

	'初期設定
	Msg1 = "現在アクティブなコンソールは1番目のコンソールです" + vbCrLf
	Msg2 = "現在アクティブなコンソールは2番目のコンソールです" + vbCrLf

	'コンソールウィンドウの割り当て
	AllocConsole

	'コンソールバッファのオープンと作成
	hCon1 = CreateFile("CONOUT$", GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
	hCon2 = CreateConsoleScreenBuffer(GENERIC_WRITE, 0, 0, CONSOLE_TEXTMODE_BUFFER, 0)

	'コンソールバッファへの書き込み
	WriteConsole hCon1, Msg1, lstrlen(Msg1), WriteNum, 0
	WriteConsole hCon2, Msg2, lstrlen(Msg2), WriteNum, 0

	'3秒間待機
	Sleep 3000

	'2番目のコンソールの表示
	SetConsoleActiveScreenBuffer hCon2
	Sleep 3000

	'1番目のコンソールの表示
	SetConsoleActiveScreenBuffer hCon1
	Sleep 3000

	'コンソールバッファのクローズ
	CloseHandle hCon1
	CloseHandle hCon2

	'コンソールウィンドウの開放
	FreeConsole

End Sub
(original text:1998/12/24 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。