マウス入力の概要

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

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

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

マウス カーソル

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

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

マウス キャプチャ

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

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

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

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

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

Mouse ClickLock

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

  • SPI_GETMOUSECLICKLOCK
  • SPI_SETMOUSECLICKLOCK
  • SPI_GETMOUSECLICKLOCKTIME
  • SPI_SETMOUSECLICKLOCKTIME

マウス構成

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

Windows では、最大 3 つのボタンを持つマウスがサポートされています。 3 ボタンのマウスでは、ボタンは左、中央、右のボタンとして指定されます。 マウス ボタン関連のメッセージと名前付き定数は、L、M、R の文字を使用してボタンを識別します。 ボタンが 1 つのマウス上のボタンは、左ボタンと認識されます。 Windows では複数のボタンがあるマウスがサポートされていますが、ほとんどのアプリケーションでは主に左ボタンを使用し、他のボタンは使うとしても最小限です。

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

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

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

XBUTTONs

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 メッセージを送信します。 これは、右クリックでコンテキスト メニューを呼び出す方法と似ています。DefWindowProc は、メニューとその親に WM_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 パラメーターは、次の値と組み合わせて指定できます。

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

 

メッセージをダブルクリックする

ユーザーがマウス ボタンを 2 回連続してクリックすると、ダブルクリック メッセージが生成されます。 ユーザーがボタンをクリックすると、カーソルのホット スポットを中心とする四角形がシステムによって確立されます。 また、クリックが発生した時刻もマークします。 ユーザーが同じボタンを 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 ペイントのカラー パレットで色をクリックすると、選択した色がパレットの横に表示されます。 ユーザーが色をダブルクリックすると、色が表示され、[色の編集] ダイアログ ボックス開きます。

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

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

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

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

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

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

WM_NCHITTEST メッセージ

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

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

Value ホット スポットの場所
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 [最大化] ボタン内。

 

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

DefWindowProc 関数は、カーソル のホット スポットがウィンドウの非クライアント領域にある場合に、他のヒットテスト値の 1 つを返します。 ウィンドウ プロシージャがこれらのヒットテスト値のいずれかを返すと、システムは非クライアント領域のマウス メッセージをポストし、ヒットテスト値をメッセージの 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 つのアイテム。
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 の処理後に次のいずれかの値を返すことによって行われます。

Value 意味
MA_ACTIVATE ウィンドウをアクティブにし、マウス メッセージを破棄しない。
MA_NOACTIVATE ウィンドウをアクティブにせず、マウス メッセージを破棄しない。
MA_ACTIVATEANDEAT ウィンドウをアクティブにし、マウス メッセージを破棄する。
MA_NOACTIVATEANDEAT ウィンドウをアクティブにしないがマウス メッセージを破棄する。

関連項目

高精細なマウスの動きを活かす