スクロールさせる API メッセージ

2013 11/15
[ 2013 / 10 / 20 ] ( 11/ 15 追記 )
本日 アップした 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 に追記しました。)

-チップスに戻る- -トップページに戻る-