C#でマウスクリックをどのようにシミュレートしますか?


128

C#winformsアプリケーションでマウスクリックをどのようにシミュレートしますか?


5
有用な答えを得ることができるように、より多くの情報を提供したい場合があります。
アンディ

36
ヒント:タイトルが質問と同じである場合、タイトルが長すぎるか、質問が短すぎます。この場合は後者です。有益な答えを与えるための合理的な機会を得るためには、誰にとってもより多くのコンテキストを提供する必要があります。
Guffa

回答:


145

いくつかのソースを組み合わせて、現在使用している以下のコードを生成しました。Windows.Formsの参照も削除したので、追加の参照なしでコンソールやWPFアプリケーションから使用できます。

using System;
using System.Runtime.InteropServices;

public class MouseOperations
{
    [Flags]
    public enum MouseEventFlags
    {
        LeftDown = 0x00000002,
        LeftUp = 0x00000004,
        MiddleDown = 0x00000020,
        MiddleUp = 0x00000040,
        Move = 0x00000001,
        Absolute = 0x00008000,
        RightDown = 0x00000008,
        RightUp = 0x00000010
    }

    [DllImport("user32.dll", EntryPoint = "SetCursorPos")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetCursorPos(int x, int y);      

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetCursorPos(out MousePoint lpMousePoint);

    [DllImport("user32.dll")]
    private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

    public static void SetCursorPosition(int x, int y) 
    {
        SetCursorPos(x, y);
    }

    public static void SetCursorPosition(MousePoint point)
    {
        SetCursorPos(point.X, point.Y);
    }

    public static MousePoint GetCursorPosition()
    {
        MousePoint currentMousePoint;
        var gotPoint = GetCursorPos(out currentMousePoint);
        if (!gotPoint) { currentMousePoint = new MousePoint(0, 0); }
        return currentMousePoint;
    }

    public static void MouseEvent(MouseEventFlags value)
    {
        MousePoint position = GetCursorPosition();

        mouse_event
            ((int)value,
             position.X,
             position.Y,
             0,
             0)
            ;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MousePoint
    {
        public int X;
        public int Y;

        public MousePoint(int x, int y)
        {
            X = x;
            Y = y;
        }
    }
}

2
17か月前にMarcos Placonaに投稿されたものに対するこの長いソースコードの利点はわかりません。
Al Kepp、2011

46
質問が曖昧であることを考えると、左クリックだけで右クリックや中クリックを吸ったり、クリックアンドドラッグを許可したりするだけでなく、それを可能にする例から人々が恩恵を受けるかもしれないと思いました。
キース

2
よく働く。私はこのようなものを探してここに来ました
CSharpie '13

これは私が探しているものですが、どのようにして下にクリックし、マウスを別の場所に移動してから解放しますか?
ninjaxelite 2016

1
@ninjaxeliteあなたが送って1. SetCursorPos, 2. MouseEvent(LeftButtonDown), 3. SetCursorPos, 4. MouseEvent(LeftButtonUp)いると思います。ヘルパーメソッドで潜在的にラップする
Michal Ciechan 2018

137

私が過去にどこか 見つけた例。いくつかの助けになるかもしれません:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Form1 : Form
{
   [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
   public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
   //Mouse actions
   private const int MOUSEEVENTF_LEFTDOWN = 0x02;
   private const int MOUSEEVENTF_LEFTUP = 0x04;
   private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
   private const int MOUSEEVENTF_RIGHTUP = 0x10;

   public Form1()
   {
   }

   public void DoMouseClick()
   {
      //Call the imported function with the cursor's current position
      uint X = (uint)Cursor.Position.X;
      uint Y = (uint)Cursor.Position.Y;
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
   }

   //...other code needed for the application
}

12
どこかにおそらくここにいますか?
mpen 2012年

3
よくやった。元の回答への参照を追加
Marcos Placona

2
このコードでエラーが発生します。PInvoke関数 'MyForm!MyForm.Form1 :: mouse_event'の呼び出しにより、スタックのバランスが崩れました。これは、マネージドPInvokeシグネチャがアンマネージドターゲットシグネチャと一致しないためと考えられます。PInvokeシグニチャーの呼び出し規則とパラメーターがターゲットのアンマネージシグニチャーと一致することを確認してください。何か案は?
Abdulla

12
XとYをuintにキャストする必要があります。
Dibesjr 2013年

1
作品は、要件に従ってカーソル位置のいくつかの変更を完全に必要とします...
Anurag Rabadia '30 / 04/19

14

System.Windows.FormsのButtonなどの一部のコントロールには、それを実行するための「PerformClick」メソッドがあります。


コントロールにPerformClickメソッドがない場合は、メソッドを拡張または追加できます。適切なMouseEventArgs引数を指定してOnMouseClickを呼び出すだけです。
トニーホプキンソン

8

1
これがVisual Studio UIのテスト名前空間で分離されたのは奇妙なことですが、デバイスごとにイベントをフィルター処理する必要のない日には、PInvokeを引き継ぐことになります。
kayleeFrye_onDeck

2
Visual Studio CommunityエディションにはこのDLLが同梱されていないようです。
CM

2
「コード化されたUIテスト」プロジェクトから別のプロジェクトにDLLをコピーして、これを機能させるために1時間費やしました。必要なすべてのDLLをコピーした場合でも、がスローされたInvalidUITestExtensionPackageExceptionため、特定のプロジェクトタイプでの実行については、残念ながら非常に煩わしいようです。
Jez

@Jez-知っておくと便利、ありがとう。私自身はまだ問題を見ていませんが、少なくともいくつかは存在していることを知っています; 0)
Rusty Nail

5

マルコスが投稿したコードを試してみましたが、うまくいきませんでした。私がY座標に与えられたものは何でも、カーソルはY軸上で動かなかった。以下のコードは、アプリケーションではなく、デスクトップの左上隅を基準にしたカーソルの位置が必要な場合に機能します。

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
    private const int MOUSEEVENTF_LEFTDOWN = 0x02;
    private const int MOUSEEVENTF_LEFTUP = 0x04;
    private const int MOUSEEVENTF_MOVE = 0x0001;

    public void DoMouseClick()
    {
        X = Cursor.Position.X;
        Y = Cursor.Position.Y;

        //move to coordinates
        pt = (Point)pc.ConvertFromString(X + "," + Y);
        Cursor.Position = pt;       

        //perform click            
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }

実際にクリックを実行するために、mouse_event関数のみを使用しています。XとYに必要な座標を指定できます。テキストボックスの値を使用しました。

            X = Convert.ToInt32(tbX.Text);
            Y = Convert.ToInt32(tbY.Text);

これは私にとって正しいものです。基本的にCursor.Positionは、マウスカーソルを任意の場所に配置するのに十分です。その後、WIN32APIを使用して実際のクリックを行います。
Ge Rong

0

彼らは私のようなドームものに見ることができないいくつかのニーズいるキースマルコスPlaconaやっただけではなくやっ

using System;
using System.Windows.Forms;

namespace WFsimulateMouseClick
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button1_Click(button1, new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 1, 1, 1));

            //by the way
            //button1.PerformClick();
            // and
            //button1_Click(button1, new EventArgs());
            // are the same
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("clicked");
        }
    }
}

1
これらのパラメーターのいずれかが必要ない場合は、button1_Click(null、null)を実行することもできます。
sab669 2013年

@ sab669確かですが、それでも彼のニーズに依存します:-)
WiiMaxx 2013年

null2番目のパラメーターでは使用しないでくださいNullReferenceException。代わりにがスローされますEventArgs.Empty
Etor Madiv

1
@EtorMadivそれはあなたがTODOをしようとしているかに依存する前に私が上で行ったようにあなたがそれを使用する場合、あなたが得る文句を言わないので、私は、...言ったようにNullReferenceException
WiiMaxx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.