まさお と申します。 宜しくお願い致します。
WinXP Pro SP1 VB6.sp6 です。
マウスクリックを取得する方法で悩んでいます。
API関数等でマウスクリックをいつでも取得できる方法はありますか?
テキストボックス(に限らないのですが)外をクリックしたらテキ
ストボックスを空白にする、ということをしたいと考えています。
Formには各種コントロールが在り、全コントロールのクリックイベ
ントにテキストボックスを空白にするコードを記すのも大変ですし、
タイトルバーをクリックされると、Form_Clickイベントは発生しませ
ん。
Declare Function GetCursorPos でマウス位置は取得できるので、
マウスクリックがさえ得できれば、テキストボックス内か、外かを判
断できます。
以上から本件質問する次第です。 宜しくお願い致します。
自プロセスWindow内ならサブクラス化かローカルフックで取得可能ですが、
もし、画面内の任意の位置でのクリックを拾いたいのなら、
グローバルフックする必要があるかと。
http://www.geocities.co.jp/SiliconValley/7406/tips/mouse/mouse2.html
上記を参考に、DirectInputで書いてみました。
他アプリのウィンドウ上でクリックされても判定できます。
'--------
Option Explicit
Implements DirectXEvent8
Private DX As DirectX8
Private DI As DirectInput8
Private Mouse As DirectInputDevice8
Private mhEventM As Long
Private Const MAX_BUFFERSIZE As Long = 10
Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)
If eventid <> mhEventM Then
Exit Sub
End If
Dim devdata(MAX_BUFFERSIZE - 1) As DIDEVICEOBJECTDATA
Dim datacnt As Long
On Error Resume Next
datacnt = Mouse.GetDeviceData(devdata, DIGDD_DEFAULT)
If Err.Number <> 0 Then
datacnt = 0
Mouse.Acquire
End If
On Error GoTo 0
Dim I As Long
For I = 0 To datacnt - 1
Select Case devdata(I).lOfs
Case DIMOFS_X
'AppendLog "X Move :" & CStr(devdata(I).lData)
Case DIMOFS_Y
'AppendLog "Y Move :" & CStr(devdata(I).lData)
Case DIMOFS_BUTTON0
AppendLog "Button0:" & CStr(devdata(I).lData)
End Select
Next
End Sub
Private Sub Form_Load()
Set DX = New DirectX8
Set DI = DX.DirectInputCreate()
Set Mouse = DI.CreateDevice("GUID_SysMouse")
Mouse.SetCommonDataFormat DIFORMAT_MOUSE2
Mouse.SetCooperativeLevel Me.hWnd, _
DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
Dim diprop As DxVBLibA.DIPROPLONG
With diprop
.lHow = DIPH_DEVICE
.lObj = 0
.lData = 100
End With
Mouse.SetProperty "DIPROP_BUFFERSIZE", diprop
mhEventM = DX.CreateEvent(Me)
Mouse.SetEventNotification mhEventM
Mouse.Acquire
End Sub
Private Sub AppendLog(ByVal Msg As String)
List1.AddItem Msg, 0
'List1.TopIndex = List1.NewIndex
List1.ListIndex = 0
End Sub
Private Sub Form_QueryUnload(Cancel%, UnloadMode%)
Mouse.Unacquire
DX.DestroyEvent mhEventM
mhEventM = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set Mouse = Nothing
Set DI = Nothing
Set DX = Nothing
End Sub
Say さん、魔界の仮面弁士 さん、ありがとうございます。
魔界の仮面弁士 さん、わざわざコードをありがとうございます。
少しお時間を下さい。 動かしてみてから、又、投稿致します。
魔界の仮面弁士 さん、ありがとうございました。
何がどのように動いているのかの解析は全くできておりませんが、
form外を含めてどこをクリックしてもリストボックスに
「Button0:0
Butoon0:128」と表示される、というのは判りました。
http://www.geocities.co.jp/SiliconValley/7406/tips/mouse/mouse2.html
も読んでいたので、お礼が遅くなってしまいました。
本当にどうもありがとうございました。
ツイート | ![]() |