2019年07月04日

Windows APIのRegisterHotkey()って、仕様変更したのかな?マウスのお供の挙動に違和感が。

マウスのお供で、新しく追加したホットキーの機能をいじっていた時、ふと、ホットキーの割り当てを起動中に変えた場合に、古いホットキーが無効にならないことに気づきました。

例えば、「ON/OFFの切替」をCtrl+Alt+Aに割り当てた後、起動したままCtrl+Alt+Bに割り当て直した場合、Ctrl+Alt+ACtrl+Alt+Bの両方で「ON/OFFの切替」が行われてしまう状況になりました。
201907_mtmohotkey.png

ホットキーの割り当ては、Windows APIのRegisterHotkey()を用いて行っています。
このAPIを使った機能を初めて実装したのは、かなり前のことになりますが……、Windows APIのRegisterHotkey()って、最近、動きが変わったのかな?

昔、使った時は、2回目の呼び出しで同じウインドウハンドルとIDを指定したら、前に指定したホットキーは自動解除されたと思うし、MSDNに書いてある解説でもそう解釈できます。

RegisterHotKeyDocJa.png

ただ、手元のWindows 10で試したら、そうはならずに1回目のRegisterHotkey()で同じハンドル、同じIDで登録した古いホットキーも有効なままになっているような動きになっています。

登録前に一旦、UnregisterHotkey()を呼び出しておけばそうはならないんですが………、昔からそうだったっけか?
昔からそうで、単なる僕の勘違いなら、プログラムを直せばいいのだが、その場合MSDNの記述が怪しいことになる。もし、最近のWindows 10の不良または仕様変更なら、OSごとに影響を調べて、場合によってはOSごとの処理分けを書く必要が出てきて面倒なことになる。

「猫でもわかるプログラミング」の第193章のホットキーを扱った項でも、ホットキーの変更でUnregisterHotKey()を呼び出している様子はない。


どっちだろう?

と思って、最新の?英語ドキュメントを調べたら、「…maintained along with the new hotkey.」(新しい設定とともに保持される)と書いてある!!

RegisterHotKeyDocEn.png

どうやら、Windows Server 2003までの挙動(重複設定時は自動解除)と、最近のWindowsの挙動(重複設定時は両方保持)では、仕様が異なっているということらしい。

うーむ、ホットキーの変更前にUnregisterHotkey()を挟むように、マウスのお供他を修正せねば…。


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/186228030
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック