ошибка в подписи PInvoke при попытке написать код щелчка мышью - PullRequest
1 голос
/ 11 марта 2012
class DoubleClickHover : Form
{
    Thread T1;
    System.Timers.Timer timer = new System.Timers.Timer(4000); //3 seconds

    public DoubleClickHover()
    {
        T1 = new Thread(new ThreadStart(DoubleClickEvent));
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    }

    #region Timer Mouse Double Click event

    //Here, the timer for Timer click event will start when mouse hovers over an area
    private void form_MouseHover(object sender, System.EventArgs e)
    {
        timer.Start();
    }

    private void form_MouseLeave(object sender, System.EventArgs e)
    {
        timer.Stop();
    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        timer.Stop();
        DoubleClickEvent();
    }

    //This method allows the user to click a file/folder by hovering/keeping still the mouse for specified time
    public void DoubleClickEvent()
    {
        // Set the cursor position
        // System.Windows.Forms.Cursor.Position();

            DoClickMouse(0x2);      // Left mouse button down
            DoClickMouse(0x4);      // Left mouse button up
            DoClickMouse(0x2);      // Left mouse button down
            DoClickMouse(0x4);      // Left mouse button up  

    }

    static void DoClickMouse(int mouseButton) 
    {
        var input = new INPUT()
        {
            dwType = 0, // Mouse input
            mi = new MOUSEINPUT() { dwFlags = mouseButton }
        };

       if (SendInput(1, input, Marshal.SizeOf(input)) == 0)
        {
            throw new Exception();
        }
    }
    [StructLayout(LayoutKind.Sequential)]
    struct MOUSEINPUT
    {
        int dx;
        int dy;
        int mouseData;
        public int dwFlags;
        int time;
        IntPtr dwExtraInfo;
    }
    struct INPUT
    {
        public uint dwType;
        public MOUSEINPUT mi;
    }
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint SendInput(uint cInputs, INPUT input, int size);

    #endregion
}

ошибка:

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

, пожалуйста, помогите.спасибо

1 Ответ

4 голосов
/ 11 марта 2012

Да, ваше определение SendInput неверно.Второй параметр - это указатель на структуру, которую необходимо объявить как переданную по ссылке:

[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

В качестве альтернативы вы можете объявить pInputs как массив (поскольку это то, чтоэто действительно так):

[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...