VB6 マウスクリック 取得方法

解決


まさお  2005-04-25 12:45:10  No: 89548  IP: [192.*.*.*]

まさお  と申します。  宜しくお願い致します。

  WinXP Pro SP1 VB6.sp6 です。

  マウスクリックを取得する方法で悩んでいます。
  API関数等でマウスクリックをいつでも取得できる方法はありますか?

  テキストボックス(に限らないのですが)外をクリックしたらテキ
ストボックスを空白にする、ということをしたいと考えています。

  Formには各種コントロールが在り、全コントロールのクリックイベ
ントにテキストボックスを空白にするコードを記すのも大変ですし、
タイトルバーをクリックされると、Form_Clickイベントは発生しませ
ん。

  Declare Function GetCursorPos でマウス位置は取得できるので、
マウスクリックがさえ得できれば、テキストボックス内か、外かを判
断できます。

  以上から本件質問する次第です。  宜しくお願い致します。

編集 削除
Say  2005-04-25 12:56:43  No: 89549  IP: [192.*.*.*]

自プロセスWindow内ならサブクラス化かローカルフックで取得可能ですが、
もし、画面内の任意の位置でのクリックを拾いたいのなら、
グローバルフックする必要があるかと。

編集 削除
魔界の仮面弁士  2005-04-25 13:45:22  No: 89550  IP: [192.*.*.*]

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

編集 削除
まさお  2005-04-25 13:50:23  No: 89551  IP: [192.*.*.*]

Say さん、魔界の仮面弁士 さん、ありがとうございます。


魔界の仮面弁士 さん、わざわざコードをありがとうございます。

少しお時間を下さい。  動かしてみてから、又、投稿致します。

編集 削除
まさお  2005-04-25 16:59:13  No: 89552  IP: [192.*.*.*]

魔界の仮面弁士 さん、ありがとうございました。

何がどのように動いているのかの解析は全くできておりませんが、
form外を含めてどこをクリックしてもリストボックスに
「Button0:0
  Butoon0:128」と表示される、というのは判りました。

http://www.geocities.co.jp/SiliconValley/7406/tips/mouse/mouse2.html
も読んでいたので、お礼が遅くなってしまいました。

本当にどうもありがとうございました。

編集 削除