タイトルのまんまですが、APIでマウスボタンの状態(押している・押していない)を取得するにはどうすればいいのでしょうか。
一度どこかのHPで見たとおもうのですが、どこだかわからなくなってしまったもので・・・
答えは簡単です。下記のメッセージをフックすればわかります。
WM_LBUTTONDBLCLK マウスの左ボタンをダブルクリックした
WM_LBUTTONDOWN マウスの左ボタンが押された。
WM_LBUTTONUP マウスの左ボタンが離された。
WM_RBUTTONDBLCLK マウスの右ボタンをダブルクリックした
WM_RBUTTONDOWN マウスの右ボタンが押された
WM_RBUTTONUP マウスの右ボタンが離された
WM_MBUTTONDBLCLK マウスの中央ボタンをダブルクリックした
WM_MBUTTONDOWN 中央のマウス ボタンが押された
WM_MBUTTONUP 中央のマウス ボタンが離された
すいません、フックって何ですか?
フックとはメッセージを捕まえることです。
下記にコードを書きましたので参考にして下さい
>AddressOf演算子を使っているのでVB5.0以上出ないと実行できません
>サンプルではForm1のメッセージだけをフックしています。
>終了する時は■ボタンで終了しないで×ボタンで終了して下さい。
>Form1のコード
Private Sub Form_Load()
'Widowsメッセージをフックします
Address = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf MsgProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call SetWindowLong(hWnd, GWL_WNDPROC, Address)
End Sub
>標準モジュール
'-------------------------------------
'ウインドウに関する情報を設定するAPI関数
'-------------------------------------
'hWnd:ウインドウのハンドル
'nIndex:定数(GWL_××参照)
'dwNewLong:設定する32ビット値
'戻り値:直前のウインドウプロシージャのアドレス
Public Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'---------------------------------------------
'Windowsメッセージをウインドウプロシージャに渡す
'---------------------------------------------
'lpPrevWndFunc:ウインドウ関数へのポインタ
'hWnd:ウインドウのハンドル
'Msg:メッセージ
'wParam:パラメータ
'lParam:パラメータ
Public Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'----
'定数
'----
Public Const WM_MOUSEMOVE = &H200 'マウスが移動した
Public Const WM_LBUTTONDOWN = &H201 'マウス左ボタンを押した
Public Const WM_LBUTTONUP = &H202 'マウス左ボタンが解放された
Public Const WM_LBUTTONDBLCLK = &H203 'マウス左ボタンがダブルクリックされた
Public Const WM_RBUTTONDOWN = &H204 'マウス右ボタンを押した
Public Const WM_RBUTTONUP = &H205 'マウス右ボタンが解放された
Public Const WM_RBUTTONDBLCLK = &H206 'マウス右ボタンがダブルクリックされた
Public Const WM_MBUTTONDOWN = &H207 'マウス中央ボタンを押した
Public Const WM_MBUTTONUP = &H208 'マウス中央ボタンが解放された
Public Const WM_MBUTTONDBLCLK = &H209 'マウス中央ボタンがダブルクリックされた
Public Const GWL_WNDPROC = (-4) 'ウインドウ関数
'-----
'変数
'-----
Public Address As Long 'ウインドウプロシージャのアドレス
'---------------------------------------------------------
'■関数名 MsgProc
'■用途 メッセージをフックする
'■引数 nHandle: フック対象のウインドウハンドル
' nMsg: Windowsのメッセージ
' wParam: メニューID
' lParam: パラメータ
'----------------------------------------------------------
Public Function MsgProc(ByVal nHandle As Long, ByVal nMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case nMsg
Case WM_LBUTTONDOWN
MsgBox ("マウス左ボタンを押しました")
Case WM_RBUTTONDOWN
MsgBox ("マウス右ボタンを押しました")
End Select
MsgProc = CallWindowProc(Address, nHandle, nMsg, wParam, lParam)
End Function
GetAsyncKeyStateを使えば物理的なマウスボタンの
押下状態を調べることができます。
(メインはキーボードの状態だけど)
これとGetSystemMetricsを併用することにより
論理的なマウスボタンの押下状態を取得できます。
サブクラス化は自ウィンドウ以外では無効になりますが
これなら常に取得できます。
何に使用されるのかはわかりませんがうまく使い分けてみて下さい。
PAPY発言の補足
フックについて
説明が全然たりてないので追加しておきます。
フックとはウインドウズのメッセージキューに格納されているメッセージを横取りしたりすることです。(どのPGM(WIN環境)でもなにかしら使っています)
ツイート | ![]() |