9
votes

C # - Pinvokestackbalance détectée sur une fonction bien documentée?

Voici mon code pour une fonction 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);

    }


1 commentaires

Éloignez-vous des déclarations VB6, elles ne sont pas correctes pour le code .NET.


5 Réponses :


3
votes

J'ai trouvé cette déclaration xxx


0 commentaires

13
votes

On dirait que votre déclaration de Dllimport est fausse. En particulier, l'utilisation de INT64 (LIPS), au lieu de UINT32.

Voici quelques détails de la référence de Pinvoke:
http://www.pinvoke.net/default.aspx/user32.mouse_event xxx


2 commentaires

@SCTOTTTT Je jongle avec un VB à C # .NET a mis à niveau une tierce partie .dll. Sur la base de son document, tous les paramètres sont un type de long VB6 dans le programme VB d'origine. .NET Upgrader les a converties vers INT . Le problème évident était, il y a un mot de passe qui devrait être de 8 chiffres et qui dépasse la capacité de type INT32. Nous avons donc changé jusqu'à C #. Mais le problème est que je reçois la même erreur au-dessus de l'utilisation d'une fonction particulière qui tente d'accéder / modifier une mémoire. Devrions-nous toujours utiliser uint ?


Une note de la documentation: "Le MDA de Pinvokestackbimbalance n'est implémenté que pour des plates-formes X86 32 bits".



3
votes

J'utilisais RealgetwindowClass à l'aide du format suivant.

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


2 commentaires

Les fonctions de l'API Win32 ne sont jamais CDECL ; Toujours utiliser stdcall , qui correspond à la valeur par défaut.


J'ai utilisé appelantconvention = appelingconvention.cdecl. L'erreur s'est éloignée :). Merci



1
votes

J'ai changé "CDECL" à "stdcall", mais cela n'a pas fonctionné.

Comme Scott Weinstein mentionné, nous devrions utiliser int Type. P>

[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);
}


0 commentaires

2
votes

Pour corriger l'erreur d'identification d'une courte -belle:

Appuyez sur: Ctrl + alt + e

sous "Assistants de débogage géré" Décochez la case Pinvokestackimbalance


0 commentaires