マウス操作の自動化(mouse_event 関数使用例)
                                                         玄関へお回り下さい。
マウス操作の自動化(mouse_event 関数使用例) (138)
      画面の設定は下図のようにして下さい。(Command2=実行ボタン)
     

Option Explicit 
'SampleNo=138 WindowsXP/Vista VB6.0(SP6) A 2009.12.20
'--------------------------------------------------------------------------
'マウスを擬似的に動作させる(P1044)
Private Declare Sub mouse_event Lib "user32" ( _
  ByVal dwFlags As Long, ByVal dx As Long, _
  ByVal dy As Long, ByVal cButtons As Long, _
  ByVal dwExtraInfo As Long)
Private Const MOUSE_MOVED = &H1       'マウスを移動する(相対座標)
Private Const MOUSEEVENTF_ABSOLUTE = &H8000& 'MOUSE_MOVED or で絶対座標を指定
Private Const MOUSEEVENTF_LEFTUP = &H4    '左ボタンUP
Private Const MOUSEEVENTF_LEFTDOWN = &H2   '左ボタンDown
Private Const MOUSEEVENTF_MIDDLEDOWN = &H20 '中央ボタンDown
Private Const MOUSEEVENTF_MIDDLEUP = &H40  '中央ボタンUP
Private Const MOUSEEVENTF_RIGHTDOWN = &H8  '右ボタンDown
Private Const MOUSEEVENTF_RIGHTUP = &H10   '右ボタンUP

'マウス位置用の POINTAPI 構造体
Private Type POINTAPI
  x As Long
  y As Long
End Type
'--------------------------------------------------------------------------
'コマンドボタン等のスクリーン座標を取得する為の物
'矩形を示す RECT 構造体(P689)
Private Type RECT
  Left  As Long
  Top  As Long
  Right As Long
  Bottom As Long
End Type
'ウィンドウのサイズを取得する(91)
Private Declare Function GetWindowRect Lib "user32" ( _
  ByVal hwnd As Long, lpRect As RECT) As Long
'--------------------------------------------------------------------------
'ディスプレイ上のウィンドウアイテムのサイズを取得する(919)
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
  ByVal nIndex As Integer) As Integer
Private Const SM_CYCAPTION = 4  'キャプションバーの高さ
Private Const SM_CXFRAME = 32  'サイズ可変ウィンドウの境界線のX方向の幅
Private Const SM_CYFRAME = 33  '  同、Y方向の幅
Private Const SM_CYMENU = 15   'メニューバーの行の高さ
Private Const SM_CXSCREEN = 0  'ディスプレイの幅
Private Const SM_CYSCREEN = 1  'ディスプレイの高さ
'--------------------------------------------------------------------------
Private Sub Command2_Click()
'Command1ボタンをクリックし、Command2ボタンに戻る
  Dim mPos As POINTAPI
  mPos = GetMiddleCenter(Command1)  'コマンドボタンのスクリーン座標を取得
  Call MouMovedPos(mPos)       'マウスの移動量を計算(絶対位置)
  'Command1の真ん中にマウスポインターを移動(絶対座標で指定)
  Call mouse_event(MOUSE_MOVED Or MOUSEEVENTF_ABSOLUTE, mPos.x, mPos.y, 0, 0)
  'マウスの左ボタンを押す
  Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
  Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
  'マウスの左ボタンを離す
  Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

  'クリックしたボタンに戻る
  mPos = GetMiddleCenter(Command2)  'コマンドボタンのスクリーン座標を取得
  Call MouMovedPos(mPos)       'マウスの移動量を計算(絶対位置)
  'Command1の真ん中にマウスポインターを移動(絶対座標で指定)
  Call mouse_event(MOUSE_MOVED Or MOUSEEVENTF_ABSOLUTE, mPos.x, mPos.y, 0, 0)

End Sub

Private Function GetMiddleCenter(ByVal ctl As Control) As POINTAPI
'コントロールの中央の絶対座標(スクリーン座標)を求める
  Dim udtRect As RECT
  'コマンドボタンのスクリーン座標を取得
  GetWindowRect ctl.hwnd, udtRect
  GetMiddleCenter.x = udtRect.Left + ((udtRect.Right - udtRect.Left) \ 2)
  GetMiddleCenter.y = udtRect.Top + ((udtRect.Bottom - udtRect.Top) \ 2)
End Function

Private Sub MouMovedPos(ByRef pos As POINTAPI)
'実際にマウスを移動させる為の補正値を求める
  '画面の解像度を取得
  Dim smx As Integer
  Dim smy As Integer
  '画面解像度の取得
  smx = GetSystemMetrics(SM_CXSCREEN)
  smy = GetSystemMetrics(SM_CYSCREEN)
  'マウスの移動量を計算(絶対位置)
  pos.x = pos.x * (65535 / smx)
  pos.y = pos.y * (65535 / smy)
End Sub

Private Sub Command1_Click()
  MsgBox "Commandボタンがクリックされました"
End Sub

マウスのクリックをプログラム上から実施したい場合等に使って下さい。
別途 SendInput 関数 を使った方法も紹介しております。 

※ ここでは、マウスの位置設定やCommand ボタンのクリック等が目的ではないので簡易的に設定しておりますので、実使用では目的に合った設定・使い方をして下さい。           



2009/09/20 修正