GetCurrentConsoleFontEx関数が常に失敗する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

GetCurrentConsoleFontEx関数が常に失敗する

#1

投稿記事 by MoNoQLoREATOR » 10年前

GetCurrentConsoleFontEx関数が常に失敗してしまいます。

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

コード:

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

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

101行目で宣言しているFontInfoのcbSizeを、GetCurrentConsoleFontExのパラメータに使用する前に設定しておくべきだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

zeek

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

#3

投稿記事 by zeek » 10年前

> 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;
としていますか?

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

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

#4

投稿記事 by MoNoQLoREATOR » 10年前

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

アバター
usao
記事: 1887
登録日時: 11年前

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

#5

投稿記事 by usao » 10年前

http://msdn.microsoft.com/en-us/library ... 85%29.aspx

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

zeek

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

#6

投稿記事 by zeek » 10年前

ソースは見ることができるのですね。

> しかし、案の定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);

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

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

#7

投稿記事 by MoNoQLoREATOR » 10年前

返信ありがとうございます。

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

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

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

アバター
usao
記事: 1887
登録日時: 11年前

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

#8

投稿記事 by usao » 10年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る