WindowsAPIの質問です。
hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , hInsttance , 0 )
といった形で利用しています。
(hInsttance は自分自身。)
CallWndRetProcですがMSDNでは
nCode パラメータの値が 0 未満の場合、CallNextHookEx 関数を呼び出し、
nCode パラメータの値が 0 以上の場合も、CallNextHookEx 関数を呼び出し、その関数の戻り値を返すことを強く推奨します。
CallNextHookEx 関数を呼び出さない場合、0 を返すべきです。
http://www.microsoft.com/japan/msdn/library/defa …
となっています。
しかし nCode == 0のとき、すなわちnCode == HC_ACTIONで
CallNextHookExを呼び出すと、例外エラーがでた末、Windows自体が不安定になってしまいます。
nCode == HC_ACTIONのとき、return 0;にすれば問題はでないのですが
なんだか気分的にスッキリしません。
ちなみに英語のドキュメントも読みましたがgreater than or equal to Zero
となっており0を含むようでした。
LRESULT CALLBACK CallWndRetProc(
int nCode,
WPARAM wParam,
LPARAM lParam ){
return CallNextHookEx( hHook, nCode , wParam , lParam );
}
こんな感じで書くと強制終了してWindowsが不安定になってしまいます。
No.2ベストアンサー
- 回答日時:
>ひょっとして使い方間違ってるでしょうか・・・
はい、間違ってます。
>「ローカルフック」とは同じインスタンス内に
>SetWindowsHookExを使うものと解釈しています。
ここはあってますが、
>hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , hInsttance , 0 )
hInsttanceがNULLでなく、かつ最後の引数でスレッドIDを指定していないのでグローバルフックになっています。
なんで、DLLにフックプロシージャをおかないと何が起こるかわかりません。
同一スレッドが対象ならインスタンスハンドルはNULL、スレッドIDはGetCurrentThreadId()の戻り値を渡せばOKです。
MSDNライブラリ、読み直してくださいね。
http://www.microsoft.com/japan/msdn/library/defa …
丁寧にご回答下さり有難うございます。
MSDN読み直しました。
ご指摘の通り
hHook = SetWindowsHookEx( WH_CALLWNDPROCRET , (HOOKPROC)CallWndRetProc , NULL, GetCurrentThreadId() );
としたところ解決しました。
No.1
- 回答日時:
グローバルフックのようですが、CallWndRetProc()、DLLの中ですか?
http://okweb.jp/kotaeru.php3?q=1343498
ってことでの確認でしたらローカルフックでもかまわないかと。
いつもご回答有難うございます。m(_ _)m
前回の質問とは関係なくWH_CALLWNDPROCRETを実験的に使っています。
DLL内部ではありません。
WndProcと同じcppファイルに書いてます。
つまりhInsttance はWinMainのHINSTANCE。
ひょっとして使い方間違ってるでしょうか・・・
「ローカルフック」とは同じインスタンス内に
SetWindowsHookExを使うものと解釈しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
昨日見た夢を教えて下さい
たまにすごいドラマチックな夢見ること、ありませんか? 起きてからも妙に記憶に残っているような、そんな夢。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
グローバルフック?にならない(SetWindowsHookEx:WH_CALLWNDPROC)
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
他のファイルの変数参照
-
C#において、同じインスタンス...
-
オブジェクト参照がオブジェク...
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
フォームの存在をチェックする方法
-
クラスのメンバ関数の呼出しに...
-
SQLを連続発行する時の正しい(?...
-
(C++) for文内でのインスタンス...
-
C# インスタンスの破棄
-
String a = "a"; と String b =...
-
javaのクラスの作り方、エラー...
-
C#でオブジェクトの有無を取得する
-
vb.netでFAXを送信する方法
-
C#「オブジェクト参照が必要で...
-
クラスのインスタンス名をクラ...
-
生成したインスタンスを削除す...
-
Dimensionクラスの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
オブジェクト参照がオブジェク...
-
C# インスタンスの破棄
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
C#「オブジェクト参照が必要で...
-
javaのクラスの作り方、エラー...
-
SQLを連続発行する時の正しい(?...
-
他のファイルの変数参照
-
文字列を日付に変換でParseExce...
-
インスタンスを同じ名前で作成...
-
[Visual C#] 優先される処理に...
-
newしないインスタンス?実体化...
おすすめ情報