2010-07-08 6 views
4

이 코드를 수동으로 사용하여 코드를 통해 시스템에서 마우스 클릭을 시뮬레이션했습니다.이 코드가 VS 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); 

를 오류 ...

오류 난 만남은 다음과 같습니다

PInvokeStackImbalance가 감지

,

PInvoke 함수 호출 'ClickingApp! Click1Application.Form1 :: mouse_event'가 스택의 불균형을 일으켰습니다. 관리되는 PInvoke 서명이 관리되지 않는 대상 서명과 일치하지 않기 때문일 수 있습니다. PInvoke 서명의 호출 규칙 및 매개 변수가 대상 관리되지 않는 시그니처와 일치하는지 확인하십시오.

답변

5

문제는 P/Invoke 서명을 사용하는 것입니다. C#을 긴 64 비트

동안

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

DWORD 32 비트

또한 당신이 호출 규칙을 지정하는 눈치가,/P를 사용하는 경우를 지정하는 윈도우 API에 대한 호출하지 않는 것이 좋습니다 또는 CallingConvention.Winapi를 사용할 수 있습니다. 잘못된 호출 규칙은 일반적으로 스택 불균형의 원인입니다.

+0

내가 알지 못하기 때문에 호출 규칙을 설명해 주시겠습니까? : $ – Mobin

+1

@Mobin, 호출 규칙은 함수에 인수가 전달되는 방법과 함수가 완료 될 때 스택을 정리하는 책임을 정의합니다 . 예를 들어, C의 전형적인 호출 규약에서는 매개 변수가 역순으로 스택에 푸시되고 호출자가 스택 정리를 담당하며 stdcall 호출 규칙은 스택 자체를 정리하는 기능을 담당합니다. 함수는 특정 호출 규칙으로 컴파일되고 호출자가 잘못된 규칙을 사용하면 스택은 일관성없는 상태로 남습니다. –

+0

오, 고마워요! 나는 그것을 얻었다 :) – Mobin