C # - PInvokeStackImbalance обнаружен на хорошо документированной функции? - PullRequest
9 голосов
/ 31 мая 2010

Вот мой код для функции ClickMouse ():

    [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 long MOUSEEVENTF_LEFTDOWN = 0x02;
    private const long MOUSEEVENTF_LEFTUP = 0x04;
    private const long MOUSEEVENTF_RIGHTDOWN = 0x08;
    private const long MOUSEEVENTF_RIGHTUP = 0x10;
    private void ClickMouse()
    {
        long X = Cursor.Position.X;
        long Y = Cursor.Position.Y;
        mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

    }

Почему-то, когда моя программа приходит к этому коду, она выдает это сообщение об ошибке:

Обнаружен PInvokeStackImbalance. Сообщение: вызов функции PInvoke. 'WindowsFormsApplication1! WindowsFormsApplication1.Form1 :: mouse_event' разбалансировал стек. Это вероятно потому, что управляемый PInvoke подпись не соответствует неуправляемой целевой подписи. Проверь это соглашение о вызовах и параметры совпадения подписи PInvoke целевая неуправляемая подпись.

Пожалуйста, помогите?

Ответы [ 5 ]

13 голосов
/ 31 мая 2010

Похоже, ваше объявление DllImport неверно. В частности использование Int64 (longs) вместо UInt32.

Вот некоторые подробности из ссылки PInvoke:
http://www.pinvoke.net/default.aspx/user32.mouse_event

[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, 
                               uint dwData,UIntPtr dwExtraInfo);
3 голосов
/ 08 апреля 2011

Я использовал RealGetWindowClass в следующем формате.

[DllImport("User32", CallingConvention=CallingConvention.Cdecl)]
public static extern int RealGetWindowClass(IntPtr hwnd, StringBuilder pszType, int cchType);

и я получаю исключение / ошибку PInvokeStackImbalance. Но когда я изменил CallingConvention на

[DllImport("User32", CallingConvention=CallingConvention.StdCall)]

ошибка ушла. Я использую VS2010 на 64-битной машине.

3 голосов
/ 31 мая 2010

Я нашел это объявление

[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, 
    uint dx, 
    uint dy, 
    uint dwData, 
    IntPtr dwExtraInfo);
2 голосов
/ 31 октября 2012

Чтобы исправить ошибку PInvokeStackImbalance:

Нажмите: CTRL + ALT + E

В разделе «Помощники по управляемой отладке» снимите флажок PInvokeStackImbalance

1 голос
/ 13 сентября 2012

Я изменил «Cdecl» на «StdCall», но он не работал.

Как отметил Скотт Вайнштейн, мы должны использовать тип int.

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

[Flags]
public enum MouseEventFlags
{
    LEFTDOWN = 0x00000002,
    LEFTUP = 0x00000004,
    MIDDLEDOWN = 0x00000020,
    MIDDLEUP = 0x00000040,
    MOVE = 0x00000001,
    ABSOLUTE = 0x00008000,
    RIGHTDOWN = 0x00000008,
    RIGHTUP = 0x00000010
}

public static void LeftClick(int x, int y)
{
    Cursor.Position = new System.Drawing.Point(x, y);
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...