C # Нажатие на определенную точку на экране - PullRequest
0 голосов
/ 01 октября 2011

Я пытаюсь выполнить щелчок мышью через c #. Я использовал функцию mouse_event, чтобы сделать это.

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
[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);

Я попробовал два метода:

Перемещение мыши к точке и нажатие на нее:

Cursor.Position = new Point(100, 100);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, Cursor.Position.X, Cursor.Position.Y, 0, 0);

Передача x, y желаемого щелчка функции:

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,100, 100, 0, 0);

В любом случае, я странная ошибка:

Помощник по управляемой отладке PInvokeStackImbalance обнаружил проблему в C: \ Users \ или \ Documents \ Visual Studio 2010 \ Projects \ ProjectName \ ProjectName \ bin \ Debug \ ProjectName.vshost.exe. Дополнительная информация: вызов функции PInvoke 'ProjectName! ProjectName.MainForm :: mouse_event' разбалансирует стек. Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.

Есть идеи по решению?

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Я бы предложил вам использовать следующую подпись p / invoke

private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
private const uint MOUSEEVENTF_LEFTUP = 0x04;

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

Обратите внимание, что хотя mouse_event удобно, оно было заменено SendInput Вы можете найти разумное объявление p / invoke для SendInput и структуры Input по следующему URL.http://www.pinvoke.net/default.aspx/user32.SendInput

0 голосов
/ 01 октября 2011

Вы, очевидно, получили этот код из старого кода VB6. long - 64-битный в .NET и C #, в отличие от VB6, где он 32-битный.

Переключитесь с long на int, и все должно быть в порядке.

edit: я был немного быстр: dwExtraInfo должен иметь тип IntPtr.

...