tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^4: SendInput関数が Vistaで動作しないのですが?
投稿日: 2009/09/19(Sat) 16:14
投稿者魔界の仮面弁士
> 上記の場合メニューバーの高さを考慮されていないので、メニューが付いている場合は
> Form をクリックする事になります。

スレッドが長くなってきたので、話を追いきれていないのですが、

>> ただ、私が本当に欲しい、
>> Private Sub Command2_Click()
>>    'Command1ボタンをクリック
>> End Sub
>> だけはだめでした。残念。

だけが目的であれば、
  Private Sub Command2_Click()
    Command1.Value = True
  End Sub
と書けるかと思います。マウス操作という本題からは外れますけれども。


また、マウス座標の移動先という点については、フォーム内の Left / Top 等から
算出するのではなく、API でデスクトップ座標を得るようにしてみては如何でしょうか。
(その方が、Frame 等の上に配置されていたりした場合にも対応しやすいですし)


Option Explicit
Private Type RECT
   x1 As Long
   y1 As Long
   x2 As Long
   y2 As Long
End Type
Private Type POINTAPI
   x As Long
   y As Long
End Type
Private Declare Function GetWindowRect Lib "user32" ( _
    ByVal hwnd As Long, ByRef rectangle As RECT) As Long
Private Declare Function SetCursorPos Lib "user32" _
    (ByVal x As Long, ByVal y As Long) As Long
Private Function GetBound(ByVal btn As VB.CommandButton) As RECT
    GetWindowRect btn.hwnd, GetBound
End Function
Private Function GetCenterLocation(ByVal btn As VB.CommandButton) As POINTAPI
    With GetBound(btn)
        GetCenterLocation.x = (.x1 + .x2) \ 2
        GetCenterLocation.y = (.y1 + .y2) \ 2
    End With
End Function

Private Sub Command2_Click()
    With GetCenterLocation(Command1)
        SetCursorPos .x, .y
    End With
End Sub


なお、クリックすることが目的ではなく、クリック時の動作を呼び出す事が
目的なのであれば、IAccessible.accDoDefaultAction を使うという選択肢もあります。

'参照設定 oleacc.dll
Option Explicit

Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
    (ByVal hWnd As Long, ByVal dwObjectID As Long, _
     ByRef riid As Currency, ByRef ppvObject As Any) As Long

Private Sub ButtonClick(ByVal targetButton As VB.CommandButton)
    Dim IID_IAccessible(1) As Currency  '{618736E0-3C3D-11CF-810C-00AA00389B71}
    IID_IAccessible(0) = 128331065315080.368@
    IID_IAccessible(1) = 818619832317929.3825@
    Const OBJID_CLIENT As Long = &HFFFFFFFC
    Dim objAcc As IAccessible
    Dim r As Long
    r = AccessibleObjectFromWindow(targetButton.hWnd, OBJID_CLIENT, IID_IAccessible(0), objAcc)
    If r = 0 Then
        objAcc.accDoDefaultAction
    Else
        Err.Raise r
    End If
End Sub

Private Sub Command2_Click()
    ButtonClick Command1
End Sub

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。