マウス入力の概要

マウスは重要ですが、アプリケーションにとってはオプションのユーザー入力デバイスです。 適切に作成されたアプリケーションにはマウス インターフェイスが含まれている必要がありますが、ユーザー入力の取得をマウスのみに依存するべきではありません。 アプリケーションでは、キーボードのフル サポートも提供する必要があります。

アプリケーションは、ウィンドウに送信またはポストされるメッセージの形式でマウス入力を受け取ります。

このセクションは、次のトピックで構成されています。

マウス カーソル

ユーザーがマウスを動かすと、システムは "マウス カーソル" と呼ばれる画面上のビットマップを移動させます。 マウス カーソルには、"ホット スポット" と呼ばれる 1 ピクセルのポイントが含まれており、システムはこのポイントを追跡してカーソルの位置として認識します。 マウス イベントが発生すると、ホット スポットを含むウィンドウは通常、イベントの結果として発生するマウス メッセージを受け取ります。 マウス メッセージを受け取るために、ウィンドウがアクティブである必要も、キーボード フォーカスがある必要もありません。

システムは、マウスの速度を制御する変数 (つまり、ユーザーがマウスを移動したときにカーソルが移動する距離) を保持しています。 SystemParametersInfo 関数を SPI_GETMOUSE または SPI_SETMOUSE フラグと共に使用して、マウスの速度を取得または設定できます。 マウス カーソルの詳細については、「カーソル」を参照してください。

マウス キャプチャ

システムは通常、マウス イベントが発生すると、カーソル のホット スポットを含むウィンドウにマウス メッセージをポストします。 アプリケーションでは、SetCapture 関数を使用してマウス メッセージを特定のウィンドウにルーティングすることで、この動作を変更できます。 ウィンドウは、アプリケーションが ReleaseCapture 関数を呼び出すか、別のキャプチャ ウィンドウを指定するまで、またはユーザーが別のスレッドによって作成されたウィンドウをクリックするまで、すべてのマウス メッセージを受け取ります。

マウス キャプチャが変更されると、システムはマウス キャプチャを失っているウィンドウに WM_CAPTURECHANGED メッセージを送信します。 メッセージの lParam パラメータは、マウス キャプチャを取得するウィンドウへのハンドルを指定します。

マウス入力をキャプチャできるのは、前面のウィンドウだけです。 背景のウィンドウがマウスをキャプチャしようとした場合、カーソルのホット スポットがそのウィンドウの表示部分内にあるときに発生したマウス イベントについてのみ、メッセージを受け取ります。

マウス入力のキャプチャは、カーソルがウィンドウの外に移動した場合でも、そのウィンドウですべてのマウス入力を受け取る必要がある場合に役に立ちます。 たとえば、アプリケーションは通常、マウス ボタン ダウン イベントの後にカーソル位置を追跡し、マウス ボタン アップ イベントが発生するまでカーソルを追従します。 アプリケーションがマウス入力をキャプチャしていない場合、ユーザーがウィンドウの外でマウス ボタンを離すと、ウィンドウはボタンアップ メッセージを受け取りません。

スレッドは GetCapture 関数を使用して、ウィンドウのいずれかがマウスをキャプチャしたかどうかを判断できます。 スレッドのウィンドウのいずれかがマウスをキャプチャした場合、GetCapture はそのウィンドウのハンドルを取得します。

マウス クリックロック

マウス クリックロック アクセシビリティ機能を使用すると、ユーザーは 1 回のクリック後にプライマリ マウス ボタンをロックダウンできます。 アプリケーションには、ボタンが押されたままであるように見えます。 ボタンのロックを解除するには、アプリケーションでマウス メッセージを送信するか、ユーザーが任意のマウス ボタンをクリックします。 この機能により、ユーザーは複雑なマウスの組み合わせをより簡単に行うことができます。 たとえば、身体的制限のある人は、テキストを強調表示したり、オブジェクトをドラッグしたり、メニューを開いたりすることがより簡単にできます。 詳細については、SystemParametersInfo に関する記事で次のフラグと「解説」を参照してください。

  • SPI_GETMOUSECLICKLOCK
  • SPI_SETMOUSECLICKLOCK
  • SPI_GETMOUSECLICKLOCKTIME
  • SPI_SETMOUSECLICKLOCKTIME

マウスの構成

マウスはアプリケーションにとって重要な入力デバイスですが、すべてのユーザーが必ずしもマウスを持っているわけではありません。 アプリケーションは、SM_MOUSEPRESENT 値を GetSystemMetrics 関数に渡すことによって、システムにマウスが含まれているかどうかを判断できます。

Windows では、最大 3 つのボタンを持つマウスがサポートされています。 3 ボタン マウスでは、ボタンは左ボタン、中央ボタン、および右ボタンとして指定されます。 マウス ボタンに関連するメッセージと名前付き定数は、L、M、および R の文字を使用してボタンを識別します。 単一ボタン マウスのボタンは、左ボタンと見なされます。 Windows では複数のボタンを持つマウスがサポートされていますが、ほとんどのアプリケーションでは主に左ボタンを使用し、それ以外のボタンは使用するとしても必要最小限に抑えます。

アプリケーションでは、マウス ホイールをサポートすることもできます。 マウスホイールは押す、または回転させることができます。 マウス ホイールが押されると、中央 (3 番目) のボタンとして機能し、通常の中央ボタン メッセージをアプリケーションに送信します。 回転すると、ホイール メッセージがアプリケーションに送信されます。 詳細については、「マウス ホイール」セクションを参照してください。

アプリケーションでは、アプリケーション コマンド ボタンをサポートできます。 これらのボタンは X ボタンと呼ばれ、インターネット ブラウザー、電子メール、およびメディア サービスに簡単にアクセスできるように設計されています。 X ボタンが押されると、 WM_APPCOMMAND メッセージがアプリケーションに送信されます。 詳細については、WM_APPCOMMAND メッセージの説明を参照してください。

アプリケーションでは、SM_CMOUSEBUTTONS 値を GetSystemMetrics 関数に渡すことによって、マウスのボタンの数を確認できます。 左利きのユーザーのマウスを構成するために、アプリケーションでは SwapMouseButton 関数を使用して、マウスの左ボタンと右ボタンの意味を逆にすることができます。 ボタンの意味を逆にするもう 1 つの方法は、SPI_SETMOUSEBUTTONSWAP 値を SystemParametersInfo 関数に渡すことです。 ただし、マウスは共有リソースであるため、ボタンの意味を逆にするとすべてのアプリケーションに影響することに注意してください。

XBUTTON

Windows では、5 つのボタンを持つマウスがサポートされています。 左、中央、および右のボタンに加えて、XBUTTON1 と XBUTTON2 があり、ブラウザーを使用するときに後方および前方のナビゲーションを提供します。

ウィンドウ・マネージャーは、WM_XBUTTON* および WM_NCXBUTTON* メッセージを介して XBUTTON1 および XBUTTON2 をサポートします。 これらのメッセージ内の WPARAM の HIWORD には、どの X ボタンが押されたかを示すフラグが含まれています。 また、これらのマウス メッセージは定数 WM_MOUSEFIRSTWM_MOUSELAST の間に収まるため、アプリケーションでは GetMessage または PeekMessage を使用してすべてのマウス メッセージをフィルター処理できます。

以下は XBUTTON1 と XBUTTON2 をサポートしています。

次の API は、これらのボタンをサポートするように変更されました。

コンポーネント アプリケーションの子ウィンドウで XBUTTON1 と XBUTTON2 のコマンドを直接実装できる可能性はほとんどありません。 そのため、DefWindowProc は、X ボタンがクリックされたときに WM_APPCOMMAND メッセージをウィンドウに送信します。 DefWindowProc は、WM_APPCOMMAND メッセージを親ウィンドウにも送信します。 これは、右クリックでコンテキスト メニューを呼び出す方法と似ています。DefWindowProcWM_CONTEXTMENU メッセージをメニューに送信し、その親にも送信します。 さらに、DefWindowProc がトップレベル ウィンドウの WM_APPCOMMAND メッセージを受信すると、コード HSHELL_APPCOMMAND 含むシェル フックを呼び出します。

ブラウザー機能、メディア機能、アプリケーションの起動、電源管理用の追加キーを備えたキーボードのサポートもあります。 詳細については、「ブラウズおよびその他の機能用のキーボード キー」を参照してください。

マウス メッセージ

ユーザーがマウスを動かしたり、マウス ボタンを押したり離したりすると、マウスによって入力イベントが生成されます。 システムは、マウス入力イベントをメッセージに変換し、適切なスレッドのメッセージ キューにポストします。 スレッドがマウス メッセージを処理するよりも速くマウス メッセージがポストされると、システムは最新のマウス メッセージを除くすべてのメッセージを破棄します。

ウィンドウは、カーソルがウィンドウの境界線内にあるときにマウス イベントが発生した場合、またはウィンドウがマウスをキャプチャした場合に、マウス メッセージを受け取ります。 マウス メッセージは、クライアント領域メッセージと非クライアント領域メッセージの 2 つのグループに分けられます。 通常、アプリケーションはクライアント領域メッセージを処理し、非クライアント領域メッセージを無視します。

このセクションは、次のトピックで構成されています。

クライアント領域マウス メッセージ

ウィンドウのクライアント領域内でマウス イベントが発生すると、ウィンドウはクライアント領域マウス メッセージを受け取ります。 ユーザーがクライアント領域内でカーソルを動かすと、システムによって WM_MOUSEMOVE メッセージがウィンドウにポストされます。 カーソルがクライアント領域内にある間にユーザーがマウス ボタンを押すか離すと、次のいずれかのメッセージがポストされます。

メッセージ 意味
WM_LBUTTONDBLCLK マウスの左ボタンがダブルクリックされました。
WM_LBUTTONDOWN マウスの左ボタンが押されました。
WM_LBUTTONUP マウスの左ボタンが離されました。
WM_MBUTTONDBLCLK マウスの中央ボタンがダブルクリックされました。
WM_MBUTTONDOWN マウスの中央ボタンが押されました。
WM_MBUTTONUP マウスの中央ボタンが離されました。
WM_RBUTTONDBLCLK マウスの右ボタンがダブルクリックされました。
WM_RBUTTONDOWN マウスの右ボタンが押されました。
WM_RBUTTONUP マウスの右ボタンが離されました。
WM_XBUTTONDBLCLK マウスの X ボタンがダブルクリックされました。
WM_XBUTTONDOWN マウスの X ボタンが押されました。
WM_XBUTTONUP マウスの X ボタンが離されました。

 

さらに、アプリケーションでは TrackMouseEvent 関数を呼び出して、システムに他の 2 つのメッセージを送信させることができます。 カーソルがクライアント領域上で一定の時間ホバーされたとき、WM_MOUSEHOVER メッセージがポストされます。 カーソルがクライアント領域を離れると、WM_MOUSELEAVE メッセージがポストされます。

メッセージのパラメータ

クライアント領域マウス メッセージの lParam パラメータは、カーソルのホット スポットの位置を示します。 下位ワードはホット スポットの x 座標を示し、上位ワードは y 座標を示します。 座標はクライアント座標で指定されます。 クライアント座標系では、画面上のすべてのポイントはクライアント領域の左上隅の座標 (0,0) を基準として指定されます。

wParam パラメータには、マウス イベント時の他のマウス ボタンおよび Ctrl と Shift キーの状態を示すフラグが含まれています。 マウス メッセージの処理が別のマウス ボタン、または Ctrl か Shift キーの状態に依存する場合に、これらのフラグをチェックできます。 wParam パラメータは、次の値を組み合わせて指定できます。

説明
MK_CONTROL CTRL キーが押されています。
MK_LBUTTON マウスの左ボタンが押されています。
MK_MBUTTON マウスの中央ボタンが押されています。
MK_RBUTTON マウスの右ボタンが押されています。
MK_SHIFT Shift キーが押されています。
MK_XBUTTON1 最初の X ボタンが押されています。
MK_XBUTTON2 2 つ目の X ボタンが押されています。

 

ダブルクリック メッセージ

ユーザーがマウス ボタンを 2 回続けて素早くクリックすると、ダブルクリック メッセージが生成されます。 ユーザーがボタンをクリックすると、システムはカーソル のホット スポットを中心とする四角形を確立します。 また、クリックが発生した時刻もマークされます。 ユーザーが同じボタンをもう一度クリックすると、ホット スポットがまだ四角形内にあるかどうかを判断し、最初のクリックからの経過時間を計算します。 ホット スポットがまだ四角形内にあり、経過時間がダブルクリック タイムアウト値を超えない場合、システムはダブルクリック メッセージを生成します。

アプリケーションでは、GetDoubleClickTime 関数と SetDoubleClickTime 関数をそれぞれ使用して、ダブルクリック タイムアウト値を取得および設定できます。 あるいは、アプリケーションは、SystemParametersInfo 関数で SPI_SETDOUBLECLICKTIME フラグを使用して、ダブルクリック タイムアウト値を設定できます。 また、SPI_SETDOUBLECLKWIDTH フラグと SPI_SETDOUBLECLKHEIGHT フラグを SystemParametersInfo に渡すことで、システムがダブルクリックを検出するために使用する四角形のサイズを設定することもできます。 ただし、ダブルクリック タイムアウト値と四角形を設定すると、すべてのアプリケーションに影響することに注意してください。

アプリケーション定義ウィンドウは、既定ではダブルクリック メッセージを受け取りません。 ダブルクリック メッセージの生成にはシステム オーバーヘッドが伴うため、これらのメッセージは、CS_DBLCLKS クラス スタイルを持つクラスに属するウィンドウに対してのみ生成されます。 アプリケーションでは、ウィンドウ クラスを登録するときにこのスタイルを設定する必要があります。 詳細については、「ウィンドウ クラス」を参照してください。

ダブルクリック メッセージは、常に 4 つのメッセージ系列の 3 番目のメッセージです。 最初の 2 つのメッセージは、最初のクリックによって生成されるボタンダウンおよびボタンアップのメッセージです。 2 回目のクリックでは、ダブルクリック メッセージが生成され、その後に別のボタンアップ メッセージが生成されます。 たとえば、マウスの左ボタンをダブルクリックすると、次のメッセージ シーケンスが生成されます。

  1. WM_LBUTTONDOWN
  2. WM_LBUTTONUP
  3. WM_LBUTTONDBLCLK
  4. WM_LBUTTONUP

ウィンドウは常にダブルクリック メッセージを受信する前にボタンダウン メッセージを受信するため、アプリケーションでは通常、ダブルクリック メッセージを使用して、ボタンダウン メッセージ中に開始したタスクを拡張します。 たとえば、ユーザーがMicrosoft ペイントのカラー パレットで色をクリックすると、選択した色がパレットの横に表示されます。 ユーザーが色をダブルクリックすると、ペイントによって色が表示され、[色の編集] ダイアログ ボックスが開きます。

非クライアント領域マウス メッセージ

クライアント領域を除くウィンドウの任意の部分でマウス イベントが発生すると、ウィンドウは非クライアント領域マウス メッセージを受け取ります。 ウィンドウの非クライアント領域は、境界線、メニュー バー、タイトル バー、スクロール バー、ウィンドウ メニュー、最小化ボタン、最大化ボタンで構成されます。

システムは、主に独自の使用のために非クライアント領域メッセージを生成します。 たとえば、カーソルのホット スポットがウィンドウの境界線に移動すると、システムは非クライアント領域メッセージを使用してカーソルを両方向矢印に変更します。 組み込みのマウス インターフェイスを利用するには、ウィンドウで非クライアント領域のマウス メッセージを DefWindowProc 関数に渡す必要があります。

クライアント領域マウス メッセージごとに、対応する非クライアント領域マウス メッセージがあります。 これらのメッセージの名前は、非クライアント領域メッセージの名前付き定数に文字 NC が含まれていることを除いて似ています。 たとえば、カーソルを非クライアント領域に移動すると WM_NCMOUSEMOVE メッセージが生成され、カーソルが非クライアント領域にあるときにマウスの左ボタンを押すと WM_NCLBUTTONDOWN メッセージが生成されます。

非クライアント領域マウス メッセージの lParam パラメータは、カーソル ホット スポットの x 座標と y 座標を含む構造体です。 クライアント領域マウス メッセージの座標とは異なり、この座標はクライアント座標ではなく画面座標で指定されます。 画面座標系では、画面上のすべてのポイントは画面の左上隅の座標 (0,0) を基準とします。

wParam パラメータにはヒットテスト値が含まれています。これは、非クライアント領域でマウス イベントが発生した場所を示す値です。 次のセクションでは、ヒット テスト値の目的について説明します。

WM_NCHITTEST メッセージ

マウス イベントが発生するたびに、カーソル のホット スポットを含むウィンドウまたはマウスをキャプチャしたウィンドウに、WM_NCHITTEST メッセージが送信されます。 システムはこのメッセージを使用して、クライアント領域または非クライアント領域マウス・メッセージのどちらを送信するかを判別します。 マウス移動およびマウス ボタンのメッセージを受け取る必要があるアプリケーションは、WM_NCHITTEST メッセージを DefWindowProc 関数に渡す必要があります。

WM_NCHITTEST メッセージの lParam パラメータには、カーソル のホット スポットの画面座標が含まれています。 DefWindowProc 関数は座標を調べ、ホット スポットの位置を示すヒット テスト値を返します。 ヒットテスト値は、次のいずれかの値になります。

ホット スポットの場所
HTBORDER サイズ変更の境界線がないウィンドウの境界線内。
HTBOTTOM ウィンドウの水平方向の下部境界線内。
HTBOTTOMLEFT ウィンドウの境界線の左下隅。
HTBOTTOMRIGHT ウィンドウの境界線の右下隅。
HTCAPTION タイトル バー内。
HTCLIENT クライアント領域内。
HTCLOSE [閉じる] ボタン内。
HTERROR 画面の背景またはウィンドウ間の分割線上 (HTNOWHERE と同じですが、DefWindowProc 関数によってエラーを示すシステム ビープ音が生成される点が異なります)。
HTGROWBOX サイズ ボックス内 (HTSIZE と同じ)。
HTHELP [ヘルプ] ボタン内。
HTHSCROLL 水平スクロール バー内。
HTLEFT ウィンドウの左罫線内。
HTMENU メニュー内。
HTMAXBUTTON [最大化] ボタン内。
HTMINBUTTON [最小化] ボタン内。
HTNOWHERE 画面の背景またはウィンドウ間の分割線上。
HTREDUCE [最小化] ボタン内。
HTRIGHT ウィンドウの右罫線内。
HTSIZE サイズ ボックス内 (HTSIZE と同じ)。
HTSYSMENU システム メニュー内または子ウィンドウの [閉じる] ボタン内。
HTTOP ウィンドウの水平方向の上部境界線内。
HTTOPLEFT ウィンドウの境界線の左上隅。
HTTOPRIGHT ウィンドウの境界線の右上隅。
HTTRANSPARENT 現在、同じスレッド内の別のウィンドウでカバーされているウィンドウ内。
HTVSCROLL 垂直スクロール バー内。
HTZOOM [最大化] ボタン内。

 

カーソルがウィンドウのクライアント領域にある場合、DefWindowProcHTCLIENT ヒット テスト値をウィンドウ プロシージャに返します。 ウィンドウ プロシージャがこのコードをシステムに返すと、システムはカーソル ホット スポットの画面座標をクライアント座標に変換して、適切なクライアント領域マウス メッセージをポストします。

DefWindowProc 関数は、カーソルのホット スポットがウィンドウの非クライアント領域にある場合、他のヒット テスト値のいずれかを返します。 ウィンドウ プロシージャがこれらのヒット テスト値のいずれかを返すと、システムは非クライアント領域マウス メッセージをポストし、ヒット テスト値をメッセージの wParam パラメータに、カーソル座標を lParam パラメータに配置します。

マウス ソナー

マウス ソナー アクセシビリティ機能では、ユーザーが Ctrl キーを押して離したときに、ポインターの周囲にいくつかの同心円が一時的に表示されます。 この機能は、ユーザーが煩雑または高解像度に設定された画面上や低品質のモニター上で、または視覚障蕓のあるユーザーが、マウス ポインターを見つけるのに役立ちます。 詳細については、SystemParametersInfo に関する記事で次のフラグを参照してください。

SPI_GETMOUSESONAR

SPI_SETMOUSESONAR

マウス隠し

マウス隠しアクセシビリティ機能は、ユーザーが入力しているときにポインターを非表示にします。 ユーザーがマウスを動かすと、マウス ポインターが再び表示されます。 この機能により、たとえば、電子メールやその他のドキュメントで、入力されているテキストがポインターによって隠されるのを防げます。 詳細については、SystemParametersInfo に関する記事で次のフラグを参照してください。

SPI_GETMOUSEVANISH

SPI_SETMOUSEVANISH

マウス ホイール

マウス ホイールは、ホイールとマウス ボタンの機能を組み合わせたものです。 ホイールには、均等に配置された個別のノッチがあります。 ホイールを回転させると、各ノッチが検出されるたびに、ホイール メッセージがアプリケーションに送信されます。 ホイール ボタンは、通常の Windows の中央 (3 番目) ボタンとしても動作します。 マウス ホイールを押して離すと、標準の WM_MBUTTONUPWM_MBUTTONDOWN メッセージが送信されます。 3 番目のボタンをダブルクリックすると、標準の WM_MBUTTONDBLCLK メッセージが 送信されます。

マウス ホイールは、WM_MOUSEWHEEL メッセージを介してサポートされます。

マウスを回転すると、フォーカス ウィンドウに WM_MOUSEWHEEL メッセージが送信されます。 DefWindowProc 関数を使用すると、ウィンドウの親にメッセージが伝達されます。 メッセージは、処理を行うウィンドウが検出されるまで親チェーンで DefWindowProc によって伝達されるため、内部転送されません。

スクロール行数の特定

アプリケーションでは、SystemParametersInfo 関数を使用して、スクロール操作 (ホイール ノッチ) ごとにドキュメントがスクロールする行数を取得する必要があります。 行数を取得するには、アプリケーションで次の呼び出しを行います。

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

変数 "pulScrollLines" は、修飾子キーなしでマウス ホイールが回転したときの推奨スクロール行数を受け取る符号なし整数値を指します。

  • この数値が 0 の場合、スクロールは発生しません。
  • この数値が WHEEL_PAGESCROLL の場合、ホイール ロールをスクロール バーのページダウンまたはページアップ領域での 1 回のクリックとして解釈する必要があります。
  • スクロール行数が表示可能な行数を超える場合、スクロール操作をページダウンまたはページアップ操作としても解釈する必要があります。

スクロール行数の既定値は 3 です。 ユーザーがコントロール パネルの [マウスのプロパティ] シートを使用してスクロール行数を変更すると、オペレーティング システムは SPI_SETWHEELSCROLLLINES が指定されたすべてのトップレベル ウィンドウに WM_SETTINGCHANGE メッセージをブロードキャストします。 アプリケーションでは、WM_SETTINGCHANGE メッセージを受信すると、次を呼び出すことで新しいスクロール行数を取得できます。

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

スクロールするコントロール

次の表に、スクロール機能 (ユーザーが設定したスクロール行を含む) を含むコントロールの一覧を示します。

コントロール スクロール
編集コントロール 垂直方向および水平方向。
リスト ボックス コントロール 垂直方向および水平方向。
コンボ ボックス ドロップダウンされない場合、各スクロールは次の項目または前の項目を取得します。 ドロップダウンされた場合、各スクロールはメッセージをリスト ボックスに転送し、それに応じてスクロールします。
CMD (コマンド ライン) 垂直方向。
ツリー ビュー 垂直方向および水平方向。
[リスト ビュー] 垂直方向および水平方向。
上/下 スクロール 1 回で 1 項目。
トラックバーのスクロール 1 回で 1 項目。
Microsoft Rich Edit 1.0 垂直方向。 Exchange クライアントには、ホイールがサポートされていない独自のバージョンのリスト ビューおよびツリー ビュー コントロールがあることに注意してください。
Microsoft Rich Edit 2.0 垂直方向。

 

ホイール付きマウスの検出

ホイール付きマウスが接続されているかどうかを確認するには、SM_MOUSEWHEELPRESENT を指定して GetSystemMetrics を呼び出します。 戻り値が TRUE の場合、マウスが接続されていることを示します。

次の例は、複数行の編集コントロールのウィンドウ プロシージャの例です。

BOOL ScrollLines(
     PWNDDATA pwndData,   //scrolls the window indicated
     int cLinesToScroll); //number of times

short gcWheelDelta; //wheel delta from roll
PWNDDATA pWndData; //pointer to structure containing info about the window
UINT gucWheelScrollLines=0;//number of lines to scroll on a wheel rotation

gucWheelScrollLines = SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 
                             0, 
                             pulScrollLines, 
                             0);

case WM_MOUSEWHEEL:
    /*
     * Do not handle zoom and datazoom.
     */
    if (wParam & (MK_SHIFT | MK_CONTROL)) {
        goto PassToDefaultWindowProc;
    }

    gcWheelDelta -= (short) HIWORD(wParam);
    if (abs(gcWheelDelta) >= WHEEL_DELTA && gucWheelScrollLines > 0) 
    {
        int cLineScroll;

        /*
         * Limit a roll of one (1) WHEEL_DELTA to
         * scroll one (1) page.
         */
        cLineScroll = (int) min(
                (UINT) pWndData->ichLinesOnScreen - 1,
                gucWheelScrollLines);

        if (cLineScroll == 0) {
            cLineScroll++;
        }

        cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
        assert(cLineScroll != 0);

        gcWheelDelta = gcWheelDelta % WHEEL_DELTA;
        return ScrollLines(pWndData, cLineScroll);
    }

    break;

ウィンドウのアクティブ化

ユーザーが非アクティブなトップレベル ウィンドウまたは非アクティブなトップレベル ウィンドウの子ウィンドウをクリックすると、システムは (特に) WM_MOUSEACTIVATE メッセージをトップレベルまたは子ウィンドウに送信します。 このメッセージは、WM_NCHITTEST メッセージをウィンドウにポストした後、ボタンダウン メッセージをポストする前に送信されます。 WM_MOUSEACTIVATEDefWindowProc 関数に渡されると、システムはトップレベル ウィンドウをアクティブにしてから、ボタンダウン メッセージをトップレベルまたは子ウィンドウにポストします。

WM_MOUSEACTIVATE を処理することで、ウィンドウは、マウス クリックの結果としてトップレベル ウィンドウがアクティブ ウィンドウになるかどうか、およびクリックされたウィンドウが後続のボタンダウン メッセージを受け取るかどうかを制御できます。 これは、WM_MOUSEACTIVATE の処理後に次のいずれかの値を返すことで行われます。

説明
MA_ACTIVATE ウィンドウをアクティブにし、マウス メッセージを破棄しません。
MA_NOACTIVATE ウィンドウをアクティブにせず、マウス メッセージを破棄しません。
MA_ACTIVATEANDEAT ウィンドウをアクティブにし、マウス メッセージを破棄します。
MA_NOACTIVATEANDEAT ウィンドウをアクティブにしませんが、マウス メッセージを破棄します。

関連項目

高解像度マウスの動きを活用する