グローバルキーフック(Win32 API C++)
色々とメモメモ
アプリケーションが非アクティブでも受け付けるホットキーを実装しようと思った時、手軽なのがWindowsAPIのRegisterHotKey()関数だけど、同一のキーを複数のアプリケーションで使用することはできない。
どんな状況でも確実にキー入力を監視したい、となったらグローバルフックを使うしか無い。
キー入力(WM_KEYDOWNメッセージ)を引っ掛けるには、SetWindowsHookEx関数でフックタイプにWH_KEYBOARDを指定してあげればいいみたい。しかしこの関数、関数を呼び出したプロセスに飛んだメッセージしかフックしてくれない。これではグローバルホットキーにならない。
システムグローバルなフックを実現するには、DLLでSetWindowsHookEx関数を呼び出し、フックプロシージャの処理もDLL内に記述する必要がある。このDLLはすべてのプロセスの仮想アドレス空間にマッピングされ、フックプロシージャ内の処理を行うことを可能にする。
以下は、keyhook.dllを動的リンクしたhoge.exeがdll内のSetWindowHookEx関数(フックタイプWH_KEYBOARD)を呼び出し、メモ帳(notepad.exe)に送られたWM_KEYDOWNメッセージを横取りするイメージ図。いろいろと間違ってるかも。
続きを読む »Visual Studio 2013 ちょっとしたメモ(C++)
個人的な忘備録
C++&WindowsSDK の時、初期状態ではXPでは動作不可なexeがビルドされる問題(Vista以上では動作する)
プロジェクトのプロパティ>構成プロパティ>全般 を選び、その中の「プラットフォーム ツールセット」を「Visual Studio 2013 (v120)」から「Visual Studio 2013 – Windows XP (v120_xp)」に変える
こうすると普通はXPでも起動可能なexeになる
これでもダメな時は、構成プロパティ>リンカー>システムのサブシステムを参照
ここが空欄だと、XPで動かないらしい。Windowsを選択する
プロジェクト作成の際に、空のプロジェクトだと空欄になってるらしい。Win32プロジェクトを選択してるとWindowsが最初から入ってる
ビルドしたexeをVisualStudioがないPCで実行した時、「msvcp120.dllが必要」と言われ実行できない。
ユーザーにdllをインストールしてもらう手間を省くための設定(静的リンクにする)プロジェクトのプロパティを開き、「構成プロパティ」-「C/C++」-「コード生成」を選択して、 右側の「ランタイムライブラリ」を
「マルチスレッド DLL (/MD)」から「マルチスレッド (/MT)」に、もしくは
「マルチスレッド デバッグDLL (/MDd)」から「マルチスレッド デバッグ (/MTd)」に変える。
これでビルドすると、msvcp120.dllがなくても起動できるようになる
ただし、exeのサイズは大きくなる
プロジェクト名の変更方法(フォルダ名等も変える方法)
VisualStudioからプロジェクト名を変更しても、プロジェクトファイル名やフォルダ名はそのまま
変えたいなら手動で変える必要があるのでちょっとめんどくさい
- VisualStudioソリューションエクスプローラーにて
ソリューションエクスプローラーからプロジェクト名を変更
(必要なら)ソースコードのファイル名を変更
(必要なら)ヘッダファイル名を変更→ソースコードのインクルードも全部書き直し
- プロジェクトフォルダroot→プロジェクト名のフォルダに移動する
「.exe.manifest」拡張子のマニフェストファイル名を変更後のプロジェクト名に合わせる(大文字小文字は区別しないらしい)
「.vcxproj」「.vcxproj.filters」「.vcxproj.user」の拡張子のファイル名をすべて新しいプロジェクト名に変更
- 一つ上のフォルダ(プロジェクトフォルダroot)に戻る
「.sln」ファイルをメモ帳等で開き、4行目あたりの
Project(“{英数字の羅列}”) = “旧プロジェクト名”, ”旧プロジェクト名\旧プロジェクト名.vcxproj”
を新プロジェクト名に書き直す(3箇所)
「.sln」ファイルのファイル名を新プロジェクト名に変更
- フォルダ名の変更
プロジェクトフォルダ名を、新プロジェクト名に
その一つ下の旧プロジェクト名のフォルダも、新プロジェクト名に変更
- 要らないもの
旧プロジェクト名の「.sdf」「.suo」ファイルは消しても問題ない
最近のコメント