C++ を使用して Windows でキープレスを検出する

Muhammad Husnain 2024年2月16日
  1. C++ を使用する Windows アプリケーションの種類
  2. C++ を使用した Windows アプリケーションでのキーボード入力
  3. C++ を使用して Windows でキープレスを検出する
C++ を使用して Windows でキープレスを検出する

この簡単なガイドでは、C++ を使用して Windows アプリケーションでキープレスを処理する方法について説明します。 先に進む前に、C++ を使用した Windows アプリケーションについて簡単に紹介します。

C++ を使用する Windows アプリケーションの種類

C++ で開発できるアプリケーションには、次の 2 種類があります。

  1. コンソールベースのアプリケーション

    コンソール アプリケーションは、コマンド ラインからのみ実行され、テキストのみを表示できるアプリケーションです。 したがって、これらはコマンドライン アプリケーションとも呼ばれます。

  2. ウィンドウベースのアプリケーション

    一方、ウィンドウ ベースのアプリケーションは、コンソール ベースのアプリケーションとは異なり、元のネイティブ Windows C API を使用して開発され、ウィンドウ アプリケーションとして表示されるアプリケーションです。 これらのアプリケーションは、ウィンドウ形式でソフトウェアを作成するために使用され、テキスト、画像、およびそれらのすべてを表示できます。

    Windows アプリケーションを開発するには多くの方法があります。Win32 API を直接使用し、C スタイルのループを作成して Windows イベントをリッスンすることができます。 同様に、オブジェクト指向スタイルである Microsoft Foundation Classes (MFC) を使用して Windows アプリケーションを作成し、Win32 API をラップすることもできます。

    開発者は、ウィンドウで実行される Win32 プログラムを作成するときに、Windows プロシージャ関数内で Windows メッセージを具体的に処理する必要があります。 Win32 アプリケーションは、32 ビット (x86) または 64 ビット (x64) バイナリとしてビルドできます。

Windows アプリケーションを作成するときは、キーボード イベントにも注意する必要があります。

C++ を使用した Windows アプリケーションでのキーボード入力

キーボードは、次のようなさまざまな目的で使用されます。

  1. 文字入力: ユーザーが文書または編集ボックスに入力したテキスト。
  2. キーボード ショートカット: CTRL+O を使用してファイルを開くことは、アプリケーション機能を呼び出すキーストロークの例です。
  3. オペレーティング システムからのコマンド: ALT+TAB を使用してウィンドウを切り替えることは、システム機能を呼び出すキーストロークの例です。

キーボード入力に対応する場合、キーを押すすべてのケースに注意する必要があります。 たとえば、B キーが押された場合、次のシナリオが考えられます。

  • B
  • b

さらに、Ctrl キーが押されている場合、B キーを押すと、キーボード ショートカット Ctrl+B がショートカットになります。 テキストを太字にするコマンド。

キーコード

オペレーティング システムは、キーが押されるとスキャン コードを生成します。 これらのスキャン コードは、キーボードによって異なります。

これらのコードは、すべてのキーボード キーに対して一意です。 たとえば、key-leftkey-right はスキャン コードが異なります。 これらのコードは英数字で覚えにくいため、キーボード デバイス ドライバーはこれらのスキャン コードを、デバイスに依存しない仮想キー コードに変換します。

ライブラリ ファイル WinUser.h は、文字 A ~ Z と数字 0 ~ 9 を除くすべての仮想キー コードの定数を定義します。 それらの仮想コードは、対応する ASCII コードにマップされます。

  1. 数字 0 ~ 9: コードの範囲は 0x30 ~ 0x39
  2. アルファベット A ~ Z: コードの範囲は 0x41 ~ 0x5A

他のすべてのキーについては、これらのキーのスキャン コードにマッピングされる定数が定義されています。 たとえば、左矢印キーの場合、仮想コードは VK_LEFT です。 前述のように、対応する ASCII 値を持つ文字には仮想コードが定義されていません。

たとえば、VK_B のような文字 B の仮想コードはありません。 一般的に使用される仮想コードの一部を示すリストを以下に示します。

仮想コード スキャンコード 説明
VK_LBUTTON 0x01 マウスの左ボタン
VK_RBUTTON 0x02 マウスの右ボタン
VK_CANCEL 0x03 コントロールブレーク処理
VK_MBUTTON 0x04 中マウス ボタン (3 ボタン マウス)
VK_XBUTTON1 0x05 X1 マウス ボタン
VK_XBUTTON2 0x06 X2 マウス ボタン
VK_BACK 0x08 バックスペースキー
VK_TAB 0x09 TAB キー
VK_SHIFT 0x10 シフトキー
VK_CONTROL 0x11 CTRL キー
VK_MENU 0x12 ALT キー
VK_PAUSE 0x13 一時停止キー
VK_CAPITAL 0x14 CapsLock キー
VK_NUMPAD0VK_NUMPAD9 0x60 - 0x69 テンキーの 0 ~ 9 キー
VK_F1 から VK_F12 0x70 - 0x7B ファンクションキー F1 ~ F12
VK_NUMLOCK 0x90 NumLock キー
VK_SCROLL 0x91 スクロールロックキー
VK_LSHIFT 0xA0 左SHIFTキー
VK_RSHIFT 0xA1 右SHIFTキー
VK_LCONTROL 0xA2 左 CONTROL キー
VK_RCONTROL 0xA3 右 CONTROL キー
VK_LMENU 0xA4 左メニューキー
VK_RMENU 0xA5 右メニューキー

このリンク で見つけることができる他の多くのコードがあります。

C++ を使用して Windows でキープレスを検出する

キーボードでキーが押されるたびに、イベントが生成されます。 キーが押されるたびにメッセージが生成され、これらのメッセージはイベント駆動型です。

関数 GetKeyState() を使用して、押されたキーの状態を取得できます。 この関数は仮想キー コードを引数として取り、そのキーが押されているかどうかを示すフラグを返します。

GetKeyState() メソッドは、仮想キーボードのステータスを返すので興味深いものです。 この仮想状態は、メッセージがキューから削除されると変更され、メッセージ キューの内容に基づきます。

GetKeyState は、プログラムがウィンドウ メッセージを処理するときに各メッセージがキューに入れられたときのキーボードのスナップショットを提供します。 GetKeyState は、ユーザーがマウス ボタンを押したときにキーボードの状態を報告します。 たとえば、キュー内の最後のメッセージがWM _BUTTONDOWNだった場合。

構文:

if (GetKeyState(VK_SHIFT) & 0x8000) {
  // Shift down
}

ビット フラグ 0x8000 は、キーが現在押されているかどうかを決定します。

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn