2012-01-05 4 views
9

시도했습니다. [DllImport ("user32.dll")] 정적 외부 bool SetCursorPos (int X, int Y);마우스 이벤트 지정 [DllImport ("user32.dll")] 클릭, 두 번 클릭

그리고 커서를 원하는 지점으로 움직이면 꽤 잘됩니다. 전에 이런 종류의 DLL 가져 오기 시도한 적이 있지만 작동합니다. :) 그러나 나는 그 밖의 무엇을 추출 할 수 있을까요? 주로 마우스 입력을 두 번 클릭하거나 클릭하거나 휠 옵션을 사용하고 싶습니다. 어떻게 코드를 입력 할 수 있습니까? user32dll에 포함 된 항목을 확인하려면 어떻게해야합니까?

고맙습니다

+0

에 관심이있을 수있는 주제는 [.NET에서 UI 자동화가 (이다 http://msdn.microsoft.com/en -us/library/ms753326 (v = vs.110) .aspx). - 또한 X 및 Y 위치는 물리적 화면 좌표 (96 DPI의 경우 Logical과 동일하지만 다른 DPI의 경우는 그렇지 않음)에 있음을 유의하십시오. 대부분의 .NET Framework는 논리적 좌표 모두를위한). – BrainSlugs83

답변

12
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, UIntPtr dwExtraInfo); 
private const uint MOUSEEVENTF_LEFTDOWN = 0x02; 
private const uint MOUSEEVENTF_LEFTUP = 0x04; 
private const uint MOUSEEVENTF_RIGHTDOWN = 0x08; 
private const uint MOUSEEVENTF_RIGHTUP = 0x10; 

당신은 가져 오기 및 Win32API

를 사용하여 마우스와 함께 작동하도록 이러한 상수의 정의해야

사용 방법을 수행하는 아래의 마우스 조작의

void sendMouseRightclick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseDoubleClick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0); 

Thread.Sleep(150); 

    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseRightDoubleClick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 

    Thread.Sleep(150); 

    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseDown() 
{ 
    mouse_event(MOUSEEVENTF_LEFTDOWN, 50, 50, 0, 0); 
} 

void sendMouseUp() 
{ 
    mouse_event(MOUSEEVENTF_LEFTUP, 50, 50, 0, 0); 
} 

당신은 당신이 먼저 보내기해야 마우스 드래그를 수행하려는 경우 MouseDown (마우스 클릭) 및 MouseUp (릴리스 클릭)보다 마우스 위치를 변경하는 동안 클릭 한 상태로 유지합니다.

sendMouseDown(); 
Cursor.Position = new Point(30,30); 
sendMouseUp(); 
+2

추가 정보 : PInvoke 함수 'KinectHandTracking! KinectHandTracking.MainWindow :: mouse_event'에 대한 호출이 스택의 불균형을 초래합니다. 관리되는 PInvoke 서명이 관리되지 않는 대상 서명과 일치하지 않기 때문일 수 있습니다. PInvoke 서명의 호출 규칙 및 매개 변수가 대상 관리되지 않는 시그니처와 일치하는지 확인하십시오. 길은 길어야 만 – albatross

+1

그렇지 않으면 예외가 발생합니다. – albatross

+1

참고로, 'Cursor.Position' (논리적 좌표로 동작)과'User32'의'SetCursorPos' (물리적 좌표로 동작)를 혼합해서는 안됩니다. 다음은 Screen Scaling 및 UI Automation에 대한 MSDN 기사입니다. http://msdn.microsoft.com/en-us/library/aa970067(v=vs.110).aspx – BrainSlugs83

3

은 사용 가능한 API의 목록에 대한 pinvoke.net를 살펴 보자. 코드 예제와 import 문이 포함되어 있습니다. 왼쪽의 선택 항목을 확장하여 각 DLL에 사용할 수있는 API를 볼 수도 있습니다.

4

롱 유형을 사용하면 "PInvoke"오류가 발생합니다.

우리는 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); 
} 

소스 : http://www.pinvoke.net/default.aspx/user32.mouse_event

관련 문제