キーボードの配置を変更するソフトがあります。その中でも常駐せずDirectXやコマンドプロンプトでも変更が有効であるKeySwapというソフトでキー配置を変更してもDXライブラリを使い作ったソフトでは変更が反映されません。
プログラム用のPCなのでCAPSLOCKとCTRLを入れ替えてあります。作ったものの動作確認をしているときコントロールキーが全く反応せずもともとのコントロールキーを押してみたら反応しました。
また、元々のコントロールキーを離してもずっと押したままになっています。KeySwapの変更をもとに戻すとそのようなことはないのでキーボードの故障はないと思います。
押しているかの確認プログラムはゲームプログラミングの館のものです。
一応簡単な例を載せます。ちょっとした例なので裏画面とかしてないですがそのあたりは気にしないでください。
左側のシフトキーとコントロールキーの押している長さを測るものです。
KeySwapをしていても元々のコントロールキーを押さないと反応はなく、一度押すとずっと増え続けます。シフトキーのほうは離すと0に戻ります。
#include "DxLib.h"
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
DxLib_Init();
while(1){
if(ProcessMessage() == -1) break;
gpUpdateKey();
ClearDrawScreen();
DrawFormatString(0,0,GetColor(255,255,255),"%d",Key[KEY_INPUT_LSHIFT]);
DrawFormatString(0,100,GetColor(255,255,255),"%d",Key[KEY_INPUT_LCONTROL]);
}
DxLib_End();
return 0;
}
DXライブラリを使うときにキー変更を有効にするなどの関数があったりするのでしょうか?
PCはXP Pro
実行はVC++2010Expressから
DXライブラリバージョンは3.06eです。
(2)
実行中別のウィンドウがアクティブ化して、DXライブラリで作ったウィンドウが非アクティブ化したとき画面が背景の色だけになってしまいDrawGraphしたものが全く表示されなくなります。
SetAlwaysRunFlagをONにするとブラウザで文字を打った時などのキー入力で動作してしまうことになるのでOFFにしておきたいです。
ウィンドウに表示されるものを非アクティブになった状態で維持するのはどうすればいいのでしょうか?
SetAlwaysRunFlagをONにしてアクティブかどうかをチェックして非アクティブならポーズ状態としてキー入力をすべて無視というのでできそうな気はするのですが、大抵のソフトが非アクティブでも表示されているのでわざわざ非アクティブならキーを無視なんていうものを作らなくても簡単にできるような気がするのですが良い方法はないでしょうか?
よろしくおねがいします。