ホットキー押下時のメッセージが受け取れない

解決


初心者A  2009-02-17 01:49:49  No: 69682

VC++2008 EE
Windows XP

上記の環境であるアプリケーションのウィンドウがアクティブの時、
ウィンドウ内のみマウスカーソルが移動可能となるようなツールを作成しています。

制御のON/OFFはホットキーを使おうとしています。
他のウィンドウを対象に試した場合はきちんと制御できるのですが、
目的のアプリケーションを対象とすると、ホットキーを押下した際に
メッセージが受け取れず困っています。

もしかするとフックされていてうまくいかないのだろうかと予測はしているのですが、対処方法がわからず試行錯誤しているところです。

フック以外に考えられる理由や、フックされている場合の対処方法など、
何かご存知でしたらご教授願いたいと思います。

初心者故、質問内容が不明瞭なところもあるかもしれませんが、
どうぞ宜しくお願い致します。


subaru  2009-02-17 03:07:54  No: 69683

>制御のON/OFFはホットキーを使おうとしています。
>他のウィンドウを対象に試した場合はきちんと制御できるのですが、
>目的のアプリケーションを対象とすると、ホットキーを押下した際に
>メッセージが受け取れず困っています。

アプリケーション内の一部のウインドウでは動作するという意味でしょうか。
目的のアプリケーションじゃなくて目的のウインドウですよね?

>
>フック以外に考えられる理由や、フックされている場合の対処方法など、
>何かご存知でしたらご教授願いたいと思います。

どのキーを設定しても動作しませんか?
そうであればキーフックされているとは考えにくいです。
ウインドウによっては動作するということならWM_HOTKEYが監視されているとも思えません。

メインウインドウならまずアクセラレータキーに設定されていないか疑ってみてはどうでしょう。


初心者A  2009-02-17 04:45:31  No: 69684

subaru様
>アプリケーション内の一部のウインドウでは動作するという意味でしょうか。
>目的のアプリケーションじゃなくて目的のウインドウですよね?

質問の仕方が至らず申し訳ありません。
目的のアプリケーションはメインウィンドウのみとなっています。
他のウィンドウというのは、まったく別のアプリケーションのウィンドウや、
windowsのウィンドウを指しております。

>メインウインドウならまずアクセラレータキーに設定されていないか疑ってみてはどうでしょう。

目的のアプリケーションはゲームでありウィンドウモード、フルスクリーンの何れでもメニューが無く、
ホットキーに設定したキーはそのアプリケーションでは通常使用されないキーなので、
アクセラレータキーになっていることもないはずです。

もし宜しければ上記の状況を踏まえ、改めてお知恵を貸して頂ければと思います。


初心者A  2009-02-17 05:07:43  No: 69685

一点追記させて頂きます。

現在デバッグしていたところ、目的のアプリケーションがアクティブの状態でホットキーを使用すると
ホットキーの入力をメッセージを受け取ることができておらず、
逆に非アクティブであれば目的のアプリケーションが起動していても、
ホットキーの入力を受け取ることができました。

やはり目的のアプリケーションから何らかの影響を受けているということでしょうか。。。

連投申し訳ありませんが、また何か自分でわかり次第状況を書き加えたいと思います。


subaru  2009-02-17 21:45:53  No: 69686

目的のアプリケーションというのは自作したものではなくて、
そのアプリが起動中でかつアクティブのときのみ
ホットキーを受け取る自作アプリが動作しないということでしょうか。

相手がゲームならキー入力を奪われないような対策をしている
ということも考えられますね。
そのようなアプリにまで対処してしまうと今度はそのアプリを
操作するときに不都合が出るかもしれませんよ?


gak  2009-02-18 02:07:25  No: 69687

> 目的のアプリケーションはゲームであり
> 目的のアプリケーションがアクティブの状態で...
> 逆に非アクティブであれば...
十中七八、対象アプリケーションは DirectInput を利用して排他的にキーボード入力を
取得している。んで、ホットキーでは多分これに勝てない。勝ちたければもっとロー
レベルな所で奪う必要があるかと。

> 対処方法
例えば、こちらも DirectInput を用いて
  // IDirectInputDevice keyboard_device;
  keyboard_device->SetCooperativeLevel(, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
としてやれば(自分が独占的にキー入力情報を得る事はできないが)排他的にキー入力を
得ている他アプリケーション上で入力された情報でも知る事ができたハズ。

# でも、↑だと今度はホットキー等(キーイベントを他のイベントに変えてしまう機能)
# には無力かもしれない…。
# 結局、どうしても表題を実現したいならキーボードフックになっちゃうのかも


初心者A  2009-02-20 22:30:41  No: 69688

返信が遅れまして申し訳ありません。

subaru様
>そのようなアプリにまで対処してしまうと今度はそのアプリを
>操作するときに不都合が出るかもしれませんよ?

確かにそうですね・・・目的のアプリやその他のアプリで不都合がでないよ、
十分注意して進めていくようにします。

gak様
>例えば、こちらも DirectInput を用いて....
>排他的にキー入力を得ている他アプリケーション上で入力された情報でも知>る事ができたハズ。
># 結局、どうしても表題を実現したいならキーボードフックになっちゃうのかも

キーボードフックすることも視野に入れつつDirectInputを試してみようと思った矢先に、
GetAsyncKeyStateではキー入力を取得できることがわかったのですが、
これはDirectInput以外の方法でキー入力を制御していると考えて良いのでしょうか?


gak  2009-02-21 02:15:28  No: 69689

> これはDirectInput以外の方法でキー入力を制御していると考えて良いのでしょうか?
DirectInput で排他的にキーボード入力を取得するアプリケーションで試してみた。
結果、別アプリから GetAsyncKeyState() で状態取得できた。ホットキーはダメだった。
というわけで、同環境ではないので断言できないけど、初心者Aさんの目的のアプリは
DirectInput でキー入力制御している可能性が高いと俺は思う。

> GetAsyncKeyState
良く考えれば、今回のケースだと(ホットキーのように)対象アプリからキー入力を奪う
必要は無く、キー入力がされたかどうかを知る事さえできればokなんだよね。
ならば面倒な事しなくても GetAsyncKeyState で事足りるかも知れない。

> 他のスレッド( またはプロセス)のウィンドウがキーボードフォーカスを備えている場合は、0 が返ります。
http://msdn.microsoft.com/ja-jp/library/cc364583.aspx の↑解説が気に掛かったが、
> Windows NT/2000/XP: The return value is zero for the following cases: 
> ・The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.
と本家MSDNでは書かれているので、大抵の環境では問題無いのだろう。


初心者A  2009-03-05 05:10:38  No: 69690

本件についてですが、別スレッドを用意して監視し、
ホットキーコントロールで設定したキーをGetAsyncKeyStateでキー押下を
判別することで対処できました。

沢山のご意見を頂きまして、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加