ホイール等によって生成されたWM_VSCROLLの判別 – 固定ページ 2 – プログラミング – Home

ホイール等によって生成されたWM_VS...
 
通知
すべてクリア

[解決済] ホイール等によって生成されたWM_VSCROLLの判別

固定ページ 2 / 2

Gregor Samsa
 Gregor Samsa
(@Gregor Samsa)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

皆さん沢山レスを頂き有難うございます。

>デバイス側に、毎回「メッセージがなんらかの処理されたかどうか」を
>返答する設計のほうが問題

AllowMouseWheel()といった関数を用意するか、
CS_MOUSEWHEELの様なウィンドウクラススタイルを用意して、
ウィンドウがWM_MOUSEWHEELメッセージを処理するかどうかを
設定できる様にすれば良いだけです。

MSWHEEL_ROLLMSGからWM_MOUSEWHEELに変えた段階で互換性は無くなっている
のだから、もっとちゃんと設計できた筈です。
(と言っても、今更どうにもならない訳ですが)

WM_MOUSELEAVEの様な基本的なメッセージが、
毎回TrackMouseEvent()を呼ばないと送信されないという謎仕様な割に、
WM_MOUSEWHEELは何もしなくても送信されて来る設計思想が全く分かりません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>AllowMouseWheel()といった関数を用意するか、
>CS_MOUSEWHEELの様なウィンドウクラススタイルを用意して、
>ウィンドウがWM_MOUSEWHEELメッセージを処理するかどうかを
>設定できる様にすれば良いだけです。
 Windows標準の「musclass.sys」を使うマウスが多いのでフィルタドライバー
を作れば不可能ではないと思いますが、かなり大変ですね。
HID標準マウスのドライバーとi/Fが一緒ならいいですが、違う場合は個々に
作らないとだめですね。

>MSWHEEL_ROLLMSGからWM_MOUSEWHEELに変えた段階で互換性は無くなっている
>のだから、もっとちゃんと設計できた筈です。
>(と言っても、今更どうにもならない訳ですが)

>WM_MOUSELEAVEの様な基本的なメッセージが、
>毎回TrackMouseEvent()を呼ばないと送信されないという謎仕様な割に、

 PATIOさん、仲澤の意見にもあるとおり、マウスのホイール機能の内容が統一
されてない以上仕方のないことではないかと思います。

>WM_MOUSEWHEELは何もしなくても送信されて来る設計思想が全く分かりません。
マイクロソフトがホイールマウスを先に出したなら、WM_MOUSEWHEELの仕組みが
他のと違っていてもおかしくないですね。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> PATIOさん、仲澤の意見にもあるとおり、マウスのホイール機能の内容が統一
> されてない以上仕方のないことではないかと思います。
仲澤さん、敬称なくなってしまい失礼しました。


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

マウスドライバーを試せないので、以下雑感です。

Spy++で観察した結果、本来のWM_VSCOLLは、
 WM_SYSCOMMANDの中でSendされる
 マウスキャプチャーが設定されている
 マウス左ボタンが押されている
という状況下にあります。

当該ドライバーが発生するWM_VSCROLLも同じ状態なのでしょうか。


返信引用
Gregor Samsa
 Gregor Samsa
(@Gregor Samsa)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

>Spy++で観察した結果、本来のWM_VSCOLLは、
> WM_SYSCOMMANDの中でSendされる
> マウスキャプチャーが設定されている
> マウス左ボタンが押されている
>という状況下にあります。

有力な情報有難うございます。
確かにスクロールバーによるスクロールの操作の際には
WM_SYSCOMMANDが送信されて来ます。また、ホイール操作では送信されません。
全てのポインティングデバイスがそうであるという保障は無いですが、
かなりの確立で判定可能だと思います。

ただし、ホイール操作の1単位(WHEEL_DELTA)とWM_VSCROLLの
送信との対応が分からないという問題は残ります。
SystemParametersInfo関数にSPI_GETWHEELSCROLLLINES引数を渡して得られる回数だけ
連続してWM_VSCROLLメッセージの送信があった場合に、
WHEEL_DELTA分のホイール操作がされたと解釈するしか無いのでしょう。
しかし、どの程度の時間までを連続と判断するかの問題があります。
これは実際に操作感を試験して設定するより他無いのでしょうね。

また、こちらでテストした限りでは
なぜか垂直・水平どちらのスクロールバーの操作をしているかに関係なく、
SC_VSCROLLが送信されて来る時とSC_HSCROLLが送信されて来る時があるのが謎ですが。
これは判定には差し支えないので良いのですが。

一先ず目処が付きましたのでこれで解決と致します。
皆さん有難うございました。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました