Что я должен сделать, чтобы этот код работал в VS 2010? - PullRequest
4 голосов
/ 08 июля 2010

Я использовал этот код вручную для имитации щелчка мышью по системе с помощью кода.

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(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_RIGHTDOWN = 0x08;
   private const int MOUSEEVENTF_RIGHTUP = 0x10;

   public Form1()
   {
   }

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

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

Но теперь я использую VS 2010 и Windows 7, и теперь я получаю ошибку при выполнении этого кода

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

Так что любые предложения для этого ...

Ошибка, с которой я сталкиваюсь:

Обнаружен дисбаланс PInvokeStack

При вызове функции PInvoke 'ClickingApp! ClickingApp.Form1 :: mouse_event' разбалансирован стек. Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.

1 Ответ

5 голосов
/ 08 июля 2010

Проблема с подписью P / Invoke, попробуйте это.

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

DWORD - 32 бита, а длина C # - 64 бита

Также только что заметил, что вы задаете соглашение о вызовах, лучше не указывать его при использовании P / Invoke для Windows API, или вы можете использовать CallingConvention.Winapi, неправильное соглашение о вызовах обычно является причиной дисбаланса стека.

...