環境 : Win7 Home(64bit) , VS2012 Express
Win32APIの ReadConsoleOutput() についてです.
MSDNによると,この関数は,
情報を取得したい領域矩形をコンソールスクリーンバッファからはみ出す形に指定した場合でも
よろしくやってくれる(はみ出さない部分についてのみの情報をくれる)ことになっているのですが,
プロジェクトが「Unicode文字セットを使用する」設定になっているとうまくいかないようで困っております.
以下のコードを
「マルチバイト文字セットを使用する」設定でビルド→実行した場合だと
ただしく はみ出さない部分についての情報を取得できています.
(結果スクリーンショット添付します.これが所望の動作です)
しかし,前述のように設定を「Unicode~」に変えると正しく取得できません.
なぜか結果の一部に 0 が入れられてしまうのです.
(結果とデバッガで受取バッファ内を見たところのスクリーンショット添付します)
原因や対応策(Unicode設定で所望の結果を得る方法)についてご教授いただきたく,お願い申し上げます.
► スポイラーを表示
コード:
//Win32コンソールアプリケーションとして作成
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#ifdef _UNICODE
#define COUT std::wcout
inline WCHAR &GetChar( CHAR_INFO *pCI ){ return pCI->Char.UnicodeChar; }
#else
#define COUT std::cout
inline CHAR &GetChar( CHAR_INFO *pCI ){ return pCI->Char.AsciiChar; }
#endif
int _tmain(int argc, _TCHAR* argv[])
{
//コンソールに適当な表示を行っておく
for( int i=0; i<80*3; i++ )
{
COUT << (rand()%10);
}
//ReadConsoleOutput()の結果受取用バッファ
const int W=4;
const int H=3;
CHAR_INFO Buff[ W*H ];
{//書き込まれなかった箇所がわかるように,最初に適当な文字をいれておく
CHAR_INFO *pBuff = Buff;
for( int y=0; y<H; y++ )
{
for( int x=0; x<W; x++, pBuff++ )
{ GetChar(pBuff) = _T('_'); }
}
}
//読み取る領域.
//この指定だと右半分がコンソール(デフォルトだと横方向サイズは80文字)からはみ出す
SMALL_RECT Rect;
Rect.Left = 78;
Rect.Top = 0;
Rect.Right = Rect.Left + W - 1;
Rect.Bottom = Rect.Top + H - 1;
//ReadConsoleOutput()で指定領域の情報を得る
HANDLE hScrnBuff = ::GetStdHandle( STD_OUTPUT_HANDLE );
COORD BuffSize = { W,H };
COORD BuffTopLeft = { 0,0 };
::ReadConsoleOutput( hScrnBuff, Buff, BuffSize, BuffTopLeft, &Rect );
{//結果の文字を表示してみる
COUT << std::endl;
CHAR_INFO *pBuff = Buff;
for( int y=0; y<H; y++ )
{
for( int x=0; x<W; x++, pBuff++ )
{
COUT << GetChar(pBuff);
}
COUT << std::endl;
}
}
//
std::cin.ignore();
return 0;
}