「D + 4 + →」 の検出ができません

解決


Who Joe Rhi  2003-08-26 03:37:45  No: 51989  IP: [192.*.*.*]

キーボード入力で[D],[4],[→]の同時押しを検出しようと思い、
GetKeyboardState関数、GetAsyncKeyState関数を用いてプログラムを作成したのですが、他の3つのキーの同時押しは検出できるのですが、何故だか[D],[4],[→]の同時押しが検出できません。
これは仕様なんでしょうか?
何方か[D],[4],[→]の同時押しの検出方法をお教えください。
環境はVC++6.0,Win2000です。
よろしくお願いします。

編集 削除
瀬戸っぷ  2003-08-26 10:31:09  No: 51990  IP: [192.*.*.*]

キーボードによっては3つのキーの同時押しを検出できない場合があります。
実際の配線とは違うと思いますが、キーボード内で縦/横に配線が有り、
キーを押すとその縦横の接点が接触するコトで通電します。
キーボード内のコントロールチップは各横配線に順に通電し、接点が接触してる場合に
縦側の配線に通電する事で交わった部分のキーを認識します。
実際の配線では、同時押しのキーの組み合わせを考慮して複雑な配線になっているようですが…
が、3つ以上のキーを同時押しした場合、配線によっては上記の回路が正しく動作せず、
逆流する事で誤認識したりするようです。

と、いうコトでキーボードのハードウェアに依存します。

# 昔、X68000のキーボードでキータイプが早い人の場合に誤認識するコトがあるので、
# そうならないようにキーボードを改造するサービス(キー1つ1つにダイオードで逆流防止)がありました。

編集 削除
Who Joe Rhi  2003-08-26 20:36:18  No: 51991  IP: [192.*.*.*]

瀬戸っぷさん、非常にわかりやすいご説明でお答えいただきありがとうございました。

編集 削除
ナオリン  2004-09-10 18:52:54  No: 51992  IP: [192.*.*.*]

3つのキーを同時押しする方法
#include <windows.h>
static char Str ="3つのボタンがおされました。";
HDC hdc;
hdc = GetDC(HWND);   //ウィンドウハンドルからHDCを取得
if(GetAsyncKeyState('D') & 0x8000){
   if(GetAsynckeyState('4') & 0x8000){
      if(GetAsyncKeyState(VK_RIGHT) & 0x8000){
            TextOut(hdc,0,0, str, lstrlen( str) ); //表示
      }
   }
}
ReleaseDC( HWND, hdc); //HDCの解放

(これはVC++の例ですけど)
これをそのまま打ち込んでみてはいかがでしょうか。

編集 削除
たく  2004-09-13 11:00:52  No: 51993  IP: [192.*.*.*]

DCを取得するとキーボードの配線が変わるのでしょうか?

編集 削除
瀬戸っぷ  2004-09-13 22:17:56  No: 51994  IP: [192.*.*.*]

> DCを取得するとキーボードの配線が変わるのでしょうか?

変わらないでしょう。
取得しているDCはTextOutの為のモノかと思われます。

編集 削除