14

私はC#、フレームワーク4(32ビット)のWindowsフォームアプリケーションに取り組んでいます。

マウスの座標を保持するリストがあり、それらをキャプチャできます。ここまでは順調ですね。

しかし、ある時点で、それらの座標に移動して、マウスを左クリックしたいと思います。

現在の状況は次のとおりです。

for (int i = 0; i < coordsX.Count; i++)
{
    Cursor.Position = new Point(coordsX[i], coordsY[i]);
    Application.DoEvents();
    Clicking.SendClick();
}

そしてClickingクラス:

class Clicking
    {
        private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002;
        private const UInt32 MOUSEEVENTF_LEFTUP = 0x0004;
        private static extern void mouse_event(
               UInt32 dwFlags, // motion and click options
               UInt32 dx, // horizontal position or change
               UInt32 dy, // vertical position or change
               UInt32 dwData, // wheel movement
               IntPtr dwExtraInfo // application-defined information
        );

        // public static void SendClick(Point location)
        public static void SendClick()
        {
            // Cursor.Position = location;
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, new System.IntPtr());
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, new System.IntPtr());
        }
    }

しかし、私はこのエラーを受け取ります:

Could not load type 'program.Clicking' from assembly 'program, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'mouse_event' has no implementation (no RVA).

そして、私は本当に問題が何であるかを理解していません...あなたたちは問題が何であるか知っていますか?または私がやろうとしていることをするためのより良い方法を知っていますか?

4

2 に答える 2

11

次の行を含めましたか?

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

これにより、プログラム内で使用しようとしているdllmouse_eventから関数がインポートされます。user32現在、プログラムは、DLL内のこのメソッドについて、それがどこから来たのかを指定するまで認識していません。

ウェブサイトPInvoke.netuser32マウスイベントは、この種のことの基本に非常に便利です。

マウスイベントの指示[DllImport(“ user32.dll”)]クリック、ダブルクリックへの回答は、理解にも大いに役立ちます。

flags関数に送信するコマンドは次のとおりです。この例では、彼が両方を同じ行でmouse_input送信していることがわかります。関数はこれらのフラグを分割して連続して実行するため、これは問題ありません。mouse downmouse upmouse_event


また、このメソッドはコマンドに置き換えられていることに注意してください。これは、このブログSendInputの良い例でSendInputあり、SetMousePos見つけることができます。

于 2012-11-22T22:22:50.687 に答える
2

私はあなたが次の行を逃していると思います

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
于 2012-11-22T22:22:49.570 に答える