none
プログラムからマウスポンターを動かしクリックすることはできますか? RRS feed

  • 質問

  •  全く別のアプリケーションのフォームなどの上でマウスポインターを動かしクリックする事はプログラムからできますか?

    もし できるとすれば どういったクラスから入れば良いですか?

    漠然とした質問で申し訳御座いませんが 御教授お願い致します。

    2006年10月26日 7:12

回答

すべての返信

  •  マウスポインターを動かす方法はわかりましたが

    http://dobon.net/vb/dotnet/system/cursorposition.html

     

    その後 動かした位置で 強制的にクリックさせたいのですが 分かりません

    やはり 御教授お願いできますでしょうか?

     

     

    2006年10月26日 7:35
  • SendInputを使います。詳しくは以下のページを見てみてください。C#ですけどね。(^^;

    マウスの自動操作
    http://homepage3.nifty.com/midori_no_bike/CS/index.html?userIO.268

    2006年10月26日 7:51
    モデレータ
  • trapemiyaさん いつもありがとうございます

     がんばって コードを解読しようとしてみたのですが 私の知識では少しハードルが高いようです

    SendInputを調べてみます

     

    2006年10月26日 9:04
  • その別のプログラムが自作のものであれば、
    そのプログラムに、クリックしたことにするようなメッセージを受け付けるようにすれば良いと思います。

    2006年10月26日 13:02
  •  じゃんぬねっと さんからの引用

    その別のプログラムが自作のものであれば、
    そのプログラムに、クリックしたことにするようなメッセージを受け付けるようにすれば良いと思います。

    じゃんぬねっとさん いつもありがとうございます

    自作じゃないプログラム(製図ソフト)なんです

    2006年10月26日 13:46
  •  trapemiya さんからの引用

    SendInputを使います。詳しくは以下のページを見てみてください。C#ですけどね。(^^;

    マウスの自動操作
    http://homepage3.nifty.com/midori_no_bike/CS/index.html?userIO.268

    ここを見て 自分なりに 必要ではないかと思われるところだけ VBに書き換えて見ました(間違っているかもしれませんが)

        Structure input2
            Public type As Integer
            Public mi As MOUSEINPUT
        End Structure
        Structure MOUSEINPUT
            Public dx As Integer
            Public dy As Integer
            Public mouseData As Integer
            Public dwFlags As Integer
            Public time As Integer
            Public dwExtraInf As IntPtr
        End Structure

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim xx As Integer = Me.Top + Button2.Top + 30
            Dim yy As Integer = Me.Left + Button2.Left + 10
            Dim input(3) As input2
            input(0) = New input2
            input(0).mi.dwFlags = MOUSEEVENTF_LEFTDOWN
            input(1) = New input2
            input(1).mi.dx = xx
            input(1).mi.dy = yy

            input(2) = New input2
            input(2).mi.dwFlags = MOUSEEVENTF_LEFTUP

            SendInput(3, input, Marshal.SizeOf(input))
            'Dim p As Point = New Point(xx, yy)
            'Windows.Forms.Cursor.Position = p
        End Sub
        Private Const INPUT_KEYBOARD As Object = 1
        Private Const INPUT_MOUSE As Object = 0
        Private Const MOUSE_MOVED As Object = &H1
        Private Const MOUSEEVENTF_ABSOLUTE As Object = &H8000& ' absolute move
        Private Const MOUSEEVENTF_XDOWN As Object = &H100
        Private Const MOUSEEVENTF_XUP As Object = &H200
        Private Const MOUSEEVENTF_WHEEL As Object = &H80
        Private Const MOUSEEVENTF_LEFTUP As Object = &H4   '左ボタンUP
        Private Const MOUSEEVENTF_LEFTDOWN As Object = &H2  '左ボタンDown
        Private Const MOUSEEVENTF_MIDDLEDOWN As Object = &H20 '中央ボタンDown
        Private Const MOUSEEVENTF_MIDDLEUP As Object = &H40  '中央ボタンUP
        Private Const MOUSEEVENTF_RIGHTDOWN As Object = &H8  '右ボタンDown
        Private Const MOUSEEVENTF_RIGHTUP As Object = &H10  '右ボタンUP

    でも 下記の部分がどう書けばよいのかわかりません

    [DllImport("user32.dll")]
    extern static uint SendInput(
        uint       nInputs,   // INPUT 構造体の数(イベント数)
        INPUT[]    pInputs,   // INPUT 構造体
        int        cbSize     // INPUT 構造体のサイズ
        ) ;

    [StructLayout(LayoutKind.Sequential)]  // アンマネージ DLL 対応用 struct 記述宣言

    御教授頂けないでしょうか

     

     

    2006年10月26日 13:53
  • VB2005だとここに例があります。

    スクリーンキーボードを作る
    http://homepage1.nifty.com/yasunari/VB/VB2005/ScreenKeyBoardMaking.htm

    2006年10月26日 14:19
    モデレータ
  •  trapemiya さんからの引用

    VB2005だとここに例があります。

    スクリーンキーボードを作る
    http://homepage1.nifty.com/yasunari/VB/VB2005/ScreenKeyBoardMaking.htm

    trapemiya さん いつもありがとうございます

    http://homepage3.nifty.com/midori_no_bike/CS/index.html?userIO.268
    http://homepage1.nifty.com/yasunari/VB/VB2005/ScreenKeyBoardMaking.htm

    この二つのサイトを 見比べながら なんとか実現できました

    Imports System.Runtime.InteropServices
    Imports System.Text

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim cSize As Size = Me.ClientSize
            Dim y1 As Integer = Me.Height - cSize.Height - 4
            Dim x1 As Integer = CInt((Me.Width - cSize.Width) / 2)
            Dim yy As Integer = Me.Top + Button2.Top + y1 + 1
            Dim xx As Integer = Me.Left + Button2.Left + x1 + 1

            Dim p As Point = New Point(xx, yy)
            Windows.Forms.Cursor.Position = p

            Dim inp(1) As INPUT
            inp(0).mi.dwFlags = MOUSEEVENTF_LEFTDOWN
            inp(1).mi.dwFlags = MOUSEEVENTF_LEFTUP

            SendInput(1, inp(0), Marshal.SizeOf(inp(0)))
            SendInput(1, inp(1), Marshal.SizeOf(inp(1)))

        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            MsgBox("ボタン2がクリックされました")
        End Sub
    End Class


    Public Module SendKeys
        <DllImport("user32.dll")> _
        Public Function SendInput( _
            ByVal nInputs As Integer, _
            ByRef pInputs As INPUT, _
            ByVal cbSize As Integer) _
            As Integer
        End Function
        <StructLayout(LayoutKind.Explicit)> _
        Public Structure INPUT
            <FieldOffset(0)> Dim type As Integer
            <FieldOffset(4)> Dim mi As MOUSEINPUT
            '<FieldOffset(4)> Dim ki As KEYBDINPUT
            '<FieldOffset(4)> Dim hi As HARDWAREINPUT
        End Structure
        <StructLayout(LayoutKind.Explicit)> _
        Public Structure MOUSEINPUT
            <FieldOffset(0)> Public dx As Integer
            <FieldOffset(4)> Public dy As Integer
            <FieldOffset(8)> Public mouseData As Integer
            <FieldOffset(12)> Public dwFlags As Integer
            <FieldOffset(16)> Public time As Integer
            <FieldOffset(20)> Public dwExtraInfo As IntPtr
        End Structure
        Public Const INPUT_KEYBOARD As Object = 1
        Public Const INPUT_MOUSE As Object = 0
        Public Const MOUSE_MOVED As Object = &H1
        Public Const MOUSEEVENTF_ABSOLUTE As Object = &H8000& ' absolute move
        Public Const MOUSEEVENTF_XDOWN As Object = &H100
        Public Const MOUSEEVENTF_XUP As Object = &H200
        Public Const MOUSEEVENTF_WHEEL As Object = &H80
        Public Const MOUSEEVENTF_LEFTUP As Object = &H4   '左ボタンUP
        Public Const MOUSEEVENTF_LEFTDOWN As Object = &H2  '左ボタンDown
        Public Const MOUSEEVENTF_MIDDLEDOWN As Object = &H20 '中央ボタンDown
        Public Const MOUSEEVENTF_MIDDLEUP As Object = &H40  '中央ボタンUP
        Public Const MOUSEEVENTF_RIGHTDOWN As Object = &H8  '右ボタンDown
        Public Const MOUSEEVENTF_RIGHTUP As Object = &H10  '右ボタンUP

    End Module

    ちょっと違う部分があるような気がしますが 正常に動いたのでOKです

    有難う御座いました。

     

    2006年10月27日 6:51