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

解決


まさお  2005-04-25 21:45:10  No: 89548

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

  WinXP Pro SP1 VB6.sp6 です。

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

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

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

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

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


Say  2005-04-25 21:56:43  No: 89549

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


魔界の仮面弁士  2005-04-25 22:45:22  No: 89550

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 22:50:23  No: 89551

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

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

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


まさお  2005-04-26 01:59:13  No: 89552

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加