本日 アップした OnScroll での マウスのスクロールメッセージ取得は XP から実装された機能で マウス
メッセージをフックしなくても スクロールホイール信号を利用出来る事は
テクニカルインフォーマーション に書いたのですが スクロールメッセージを 感知してからの流れの 方を簡単に
こちらのプログラミングティップに書いておこうと思います。
マウスのスクロールメッセージ を取得した後は WM_MOUSEWHEEL と言うメッセージを マウスオーバーの子ウィンドウに
ポストしています。( Send でも良いのですが Post の方が自分はすぐに行動出来ますから相手の影響を排除出来ます。)
WM_MOUSEWHEEL は Win 98 NT 4.0 以降で OK ですから 現在では殆どのソフトでサポートされているかと思います。
MSDN では Sent to the focus window に送られて 後は DefWindowProc が宜しくしてくれる。と書いて
有ります。Focus Window ですから基本的には System は アクティブ ( フォアグラウンド ) な Window の Focus ウィンドウに
送ってくる事になります。此はまあ当たり前の事ですが 此の OnScroll では インアクティブなウィンドウをスクロールさせたい
訳ですから マウスカーソルが アクティブな Window の 上では何もしません。マウスカーソルが インアクティブな
Window の 上に有り スクロールホイールが廻された時に focus window の代わりに マウスカーソルが有る 子ウィンドウに
此の WM_MOUSEWHEEL メッセージを送っています。( wParam, lParam については MSDN を参照して下さい。)
此で 縦方向のスクロールは OK ですが 横方向スクロール も有ります。横方向スクロール には
WM_MOUSEHWHEEL と言う メッセージを搬出すれば良いのですが 比較的 新しいメッセージで 2005 年の WINUSER.H では
define されていません。又 System が 此をメッセージ出来るのは Win Vista 以降となっているようです。
したがって ソフトも 此の WM_MOUSEHWHEEL を実装していない物も多く 横スクロールボタンでも 横スクロール しない
物は多々あるようです。
整理すれば
|
入手シグナル |
Send メッセージ |
| 縦スクロール |
RI_MOUSE_WHEEL |
WM_MOUSEWHEEL |
| 横スクロール |
0x800 ( RI_MOUSE_HWHEEL ?? ) |
WM_MOUSEHWHEEL |
| サポート |
Vista 以降 |
ソフトによる |
と言う様な事になるのでしょうが Shift + 縦スクロール での 横スクロールは より汎用性を考えて WM_MOUSEHWHEEL ではなく
WM_HSCROLL メッセージで処理していますから 若干性質が違っています。したがって 横スクロール ボタンでは 横スクロール
しなくても Shift + 縦スクロール では横スクロール 出来る事が有ります。特に XP では システムが 横スクロール
メッセージ ( 0x800 ( RI_MOUSE_HWHEEL ?? ) )を出しませんから Shift + 縦スクロールがかえって便利に使用出来るかも
知れません。
又 Control + スクロール でも 本来の WM_MOUSEHWHEEL ではなくて WM_VSCROLL メッセージで処理しています。したがって
ソフトが WM_MOUSEWHEEL をサポートしていなくてもスクロール出来る可能性が有ります。( マウススクロールホイールで
スクロールしないウィンドウでも 此でスクロール出来る物も結構有るようです。)
以上の事は 自分で 調べて 実験 デバッグ して 全ての バージョンのウィンドウで検証した結果ですから 大体当たっているとは
思いますが 正確には MSDN の方で調べてみて下さい。( RI_MOUSE_HWHEEL については資料が少ない感じですが 値だけは
0x800 と言うのは とりあえず MSDN に書いてあります。)
( Control + スクロール の条文を 11/15 に追記しました。)