HANDLE CreateConsoleScreenBuffer( DWORD AccessFlags, DWORD ShareMode, LPSECURITY_ATTRIBUTES Security, DWORD BufType, PVOID Reserved);
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
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
作成したコンソールバッファは、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が返される。
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);
}
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