C++ を使用して Windows でキープレスを検出する
この簡単なガイドでは、C++ を使用して Windows アプリケーションでキープレスを処理する方法について説明します。 先に進む前に、C++ を使用した Windows アプリケーションについて簡単に紹介します。
C++ を使用する Windows アプリケーションの種類
C++ で開発できるアプリケーションには、次の 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 アプリケーションでのキーボード入力
キーボードは、次のようなさまざまな目的で使用されます。
- 文字入力: ユーザーが文書または編集ボックスに入力したテキスト。
- キーボード ショートカット: CTRL+O を使用してファイルを開くことは、アプリケーション機能を呼び出すキーストロークの例です。
- オペレーティング システムからのコマンド: ALT+TAB を使用してウィンドウを切り替えることは、システム機能を呼び出すキーストロークの例です。
キーボード入力に対応する場合、キーを押すすべてのケースに注意する必要があります。 たとえば、B
キーが押された場合、次のシナリオが考えられます。
B
b
さらに、Ctrl キーが押されている場合、B
キーを押すと、キーボード ショートカット Ctrl+B がショートカットになります。 テキストを太字にするコマンド。
キーコード
オペレーティング システムは、キーが押されるとスキャン コードを生成します。 これらのスキャン コードは、キーボードによって異なります。
これらのコードは、すべてのキーボード キーに対して一意です。 たとえば、key-left
と key-right
はスキャン コードが異なります。 これらのコードは英数字で覚えにくいため、キーボード デバイス ドライバーはこれらのスキャン コードを、デバイスに依存しない仮想キー コードに変換します。
ライブラリ ファイル WinUser.h
は、文字 A ~ Z と数字 0 ~ 9 を除くすべての仮想キー コードの定数を定義します。 それらの仮想コードは、対応する ASCII コードにマップされます。
- 数字 0 ~ 9: コードの範囲は 0x30 ~ 0x39
- アルファベット 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_NUMPAD0 ~ VK_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
は、キーが現在押されているかどうかを決定します。
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