皆さん沢山レスを頂き有難うございます。
>デバイス側に、毎回「メッセージがなんらかの処理されたかどうか」を
>返答する設計のほうが問題
AllowMouseWheel()といった関数を用意するか、
CS_MOUSEWHEELの様なウィンドウクラススタイルを用意して、
ウィンドウがWM_MOUSEWHEELメッセージを処理するかどうかを
設定できる様にすれば良いだけです。
MSWHEEL_ROLLMSGからWM_MOUSEWHEELに変えた段階で互換性は無くなっている
のだから、もっとちゃんと設計できた筈です。
(と言っても、今更どうにもならない訳ですが)
WM_MOUSELEAVEの様な基本的なメッセージが、
毎回TrackMouseEvent()を呼ばないと送信されないという謎仕様な割に、
WM_MOUSEWHEELは何もしなくても送信されて来る設計思想が全く分かりません。
>AllowMouseWheel()といった関数を用意するか、
>CS_MOUSEWHEELの様なウィンドウクラススタイルを用意して、
>ウィンドウがWM_MOUSEWHEELメッセージを処理するかどうかを
>設定できる様にすれば良いだけです。
Windows標準の「musclass.sys」を使うマウスが多いのでフィルタドライバー
を作れば不可能ではないと思いますが、かなり大変ですね。
HID標準マウスのドライバーとi/Fが一緒ならいいですが、違う場合は個々に
作らないとだめですね。
>MSWHEEL_ROLLMSGからWM_MOUSEWHEELに変えた段階で互換性は無くなっている
>のだから、もっとちゃんと設計できた筈です。
>(と言っても、今更どうにもならない訳ですが)
>WM_MOUSELEAVEの様な基本的なメッセージが、
>毎回TrackMouseEvent()を呼ばないと送信されないという謎仕様な割に、
PATIOさん、仲澤の意見にもあるとおり、マウスのホイール機能の内容が統一
されてない以上仕方のないことではないかと思います。
>WM_MOUSEWHEELは何もしなくても送信されて来る設計思想が全く分かりません。
マイクロソフトがホイールマウスを先に出したなら、WM_MOUSEWHEELの仕組みが
他のと違っていてもおかしくないですね。
> PATIOさん、仲澤の意見にもあるとおり、マウスのホイール機能の内容が統一
> されてない以上仕方のないことではないかと思います。
仲澤さん、敬称なくなってしまい失礼しました。
マウスドライバーを試せないので、以下雑感です。
Spy++で観察した結果、本来のWM_VSCOLLは、
WM_SYSCOMMANDの中でSendされる
マウスキャプチャーが設定されている
マウス左ボタンが押されている
という状況下にあります。
当該ドライバーが発生するWM_VSCROLLも同じ状態なのでしょうか。
>Spy++で観察した結果、本来のWM_VSCOLLは、
> WM_SYSCOMMANDの中でSendされる
> マウスキャプチャーが設定されている
> マウス左ボタンが押されている
>という状況下にあります。
有力な情報有難うございます。
確かにスクロールバーによるスクロールの操作の際には
WM_SYSCOMMANDが送信されて来ます。また、ホイール操作では送信されません。
全てのポインティングデバイスがそうであるという保障は無いですが、
かなりの確立で判定可能だと思います。
ただし、ホイール操作の1単位(WHEEL_DELTA)とWM_VSCROLLの
送信との対応が分からないという問題は残ります。
SystemParametersInfo関数にSPI_GETWHEELSCROLLLINES引数を渡して得られる回数だけ
連続してWM_VSCROLLメッセージの送信があった場合に、
WHEEL_DELTA分のホイール操作がされたと解釈するしか無いのでしょう。
しかし、どの程度の時間までを連続と判断するかの問題があります。
これは実際に操作感を試験して設定するより他無いのでしょうね。
また、こちらでテストした限りでは
なぜか垂直・水平どちらのスクロールバーの操作をしているかに関係なく、
SC_VSCROLLが送信されて来る時とSC_HSCROLLが送信されて来る時があるのが謎ですが。
これは判定には差し支えないので良いのですが。
一先ず目処が付きましたのでこれで解決と致します。
皆さん有難うございました。