Ваше объявление Win32 API неверно: «long» отображается на Int64 в .NET Framework, что почти всегда неверно для вызовов Windows API.
Замена long на int должна работать:
public static extern void mouse_event (int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
Для дальнейшего использования вы можете проверить pinvoke.net всякий раз, когда вы 'мы ищем правильный способ вызова функций API - хотя он и не идеален, он показал бы правильное объявление для mouse_event .
(РЕДАКТИРОВАТЬ, 26 марта 2012 г.): И хотя приведенное мной объявление действительно работает, замена long
на uint
была бы еще лучше, поскольку DWORD
в Win32 - это 32-битное целое число без знака .В этом случае вам лучше использовать подписанное целое число (поскольку ни флаги, ни другие аргументы никогда не будут достаточно большими, чтобы вызвать переполнение знака), но это определенно не всегда так.Правильное объявление pinvoke.net, а также следующее:
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
Еще один ответ на этот вопрос уже предоставил правильное объявление, и проблема uint
была также отмечена в комментариях.Я отредактировал свой собственный ответ, чтобы сделать это более очевидным;другие участники SO всегда должны свободно редактировать неправильные сообщения, кстати.