ページ 11

GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月05日(木) 21:45
by MoNoQLoREATOR
GetCurrentConsoleFontEx関数が常に失敗してしまいます。

以下はコンソールウィンドウの大きさとフォントサイズを変更するプログラムです。
► スポイラーを表示
これを実行すると、コンソール画面には次のように表示されます。

コード:

失敗:GetCurrentConsoleFontEx(iConsoleH, MaxWin, &FontInfo)
error:
パラメーターが間違っています。
失敗:SetConsoleWindowInfo(oConsoleH, TRUE/*絶対位置で指定*/, &rect)
error:
パラメーターが間違っています。
失敗:SetCurrentConsoleFontEx(oConsoleH, MaxWin, &NewFontInfo)
error:
パラメーターが間違っています。
つまり、コンソールスクリーンバッファのハンドルを取得することには成功していますが、GetCurrentConsoleFontEx関数の実行には失敗していることがわかります。
そして、パラメーターが間違っているらしいということもわかりました。
私には何がどう間違っているのかわかりません。
わかる方が居られましたらご回答おねがい致します。

Re: GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月05日(木) 23:12
by みけCAT
101行目で宣言しているFontInfoのcbSizeを、GetCurrentConsoleFontExのパラメータに使用する前に設定しておくべきだと思います。

Re: GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月05日(木) 23:37
by zeek
> GetCurrentConsoleFontEx関数の実行には失敗していることがわかります。
> そして、パラメーターが間違っているらしいということもわかりました。
> 私には何がどう間違っているのかわかりません。
> わかる方が居られましたらご回答おねがい致します。
FontInfo 構造体の最初のメンバー cbSize に構造体サイズを指定しているでしょうか?
つまり
CONSOLE_FONT_INFOEX FontInfo = { sizeof FontInfo };
あるいは
CONSOLE_FONT_INFOEX FontInfo = { sizeof(CONSOLE_FONT_INFOEX) };
あるいは
CONSOLE_FONT_INFOEX FontInfo = { 0 };
FontInfo.cbSize = sizeof FontInfo;
としていますか?

Re: GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月06日(金) 11:01
by MoNoQLoREATOR
ありがとうございます。
ご指摘通り、CONSOLE_FONT_INFOEX::cbSizeを設定すると成功しました。
改善後のソースコードがこちらです。
► スポイラーを表示
しかし、案の定SetConsoleWindowInfo関数が依然として失敗します。
LastErrorは同じく「パラメーターが間違っています。」です。
ハンドルの取得には成功していますし、指定した長方形も不正なものでは無いと思います。
私の勘違いでしょうか?それとも他に何か間違っているのでしょうか?
よろしくお願いします。

Re: GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月06日(金) 12:23
by usao
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

コンソールスクリーンバッファを作る際にGENERIC_READを指定しないとダメなように見えます.

Re: GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月06日(金) 22:07
by zeek
ソースは見ることができるのですね。

> しかし、案の定SetConsoleWindowInfo関数が依然として失敗します。
> LastErrorは同じく「パラメーターが間違っています。」です。

GetStdHandle(STD_OUTPUT_HANDLE) を使ってはいかがでしょうか?

// oConsoleH = GetConsoleH_o();
oConsoleH = GetStdHandle(STD_OUTPUT_HANDLE);

あとコンソールは 80 桁以上表示できるか気になるので

// rect.Right = winW / fontW - 1;
const int MaxW = 80;
rect.Right = (winW / fontW < MaxW ? winW / fontW : MaxW) - 1;

// CloseHandle(oConsoleH);

Re: GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月13日(金) 00:59
by MoNoQLoREATOR
返信ありがとうございます。

コンソールスクリーンバッファを作成する際にGENERIC_READを指定した場合、SetConsoleWindowInfo関数は失敗し、「ハンドルが無効です。」というラストエラーが返されました。

GetStdHandle(STD_OUTPUT_HANDLE)を使用した場合、全ての関数が成功し、設定が全て反映されたようです。
しかし、フォントサイズを5*8以下にするとSetConsoleWindowInfo関数が失敗し、「パラメーターが間違っています。」というラストエラーが返されます。
これはおそらくzeekさんが仰った「80桁」という制限のためでしょう。※画面サイズを小さくすると成功しました
これは仕方がないことですからこれで解決とさせて頂きます。

解決コードがこちらです。
► スポイラーを表示
今までご回答ありがとうございました。

Re: GetCurrentConsoleFontEx関数が常に失敗する

Posted: 2013年12月13日(金) 09:37
by usao
GetStdHandle(STD_OUTPUT_HANDLE)で現在のアクティブなスクリーンバッファへのハンドルを得ることと
CreateConsoleScreenBuffer()で新しく作るのとでは意味が違う気がするのだけど
その辺は大丈夫だったのでしょうか.