2012-05-18 4 views
1

여러 마우스 클릭을 동시에 수행 할 수 있어야하는 다중 스레드 응용 프로그램이 있습니다.가상 마우스 클릭 C#

나는 마우스 클릭을 보내야하는 과정에 IntPtr intptr이있다. 나는 웹상에서이 정보를 찾으려고 노력해 왔으며 내가 시도한 몇 가지 예가있다. 그러나 나는 그들 중 누구도 일할 자격이 없다.

내 문제를 SOLV하는 올바른 방법을 알고있는 것처럼

함수 SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

HWND 프로세스에 IntPtr입니다 인을 사용하는 것입니다. 메시지가 원하는 동작입니다. 왼쪽 클릭을 원합니다. int WM_LBUTTONDBLCLK = 0x0203; IntPtr wParam은 (이해할 수있는 한)이 문제에 대해 아무런 이해 관계가 없습니다. 그리고 클릭 좌표는 lParam입니다. 내가 좋아하는 lParam의를 구성 ,

Int32 word = MakeLParam(x, y); 

private int MakeLParam(int LoWord, int HiWord) 
    { 
     return ((HiWord << 16) | (LoWord & 0xffff)); 
    } 

그러나 당신이 이해 하듯이, 나는이 작업을 위선적 인 말투. 내 첫 번째 질문은 좌표가이 프로세스의 창 내에 있거나 절대 좌표 화면입니까? 두 번째 질문, 내가 뭘 잘못하고 있니?

+0

여기 좀 더 자세한 정보가 있습니다 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms645606(v=vs.85).aspx – mellamokb

+2

이것은 더 좋은 당신이 시작한 해결책보다 ... 왜 이것을하고 싶습니까? –

답변

0

나는 당신이 성취하고자하는 것을 100 % 확신하고 있습니다. 그러나 마우스 입력을 시뮬레이트하려면 SendInput API를 사용하는 것이 좋습니다.

입력 스트림에 삽입 할 입력 배열을 제공 할 수 있습니다.

은 참조 : 사람이 동시에 여러 번의 마우스 클릭을 보낼 이유 PInvoke reference

0

내가 이해가 안 돼요. GUI를 테스트하는 경우 잘못된 테스트입니다. 아무도 물리적으로 같은 시간 간격으로 여러 번 클릭 할 수는 없습니다.

그러나 기본적으로 차단 호출이기 때문에 귀하의 질문으로 돌아가서 SendMessage를 사용하면 도움이되지 않습니다. PostMessage를 사용하려고해도 메시지 큐가 UI 스레드에서 펌프로 전달되어 메시지가 일시적으로 중단되고 순차적으로 처리되므로 동시 클릭을 수행 할 수 없습니다. 좌표가 전체 화면해야한다 있도록 핸들을 설정한다면, 그때는 바탕 화면을 클릭 보냅니다 -

+0

Okey. 나는 이것을 조금 분명히해야한다고 생각한다. 내가 원하는 것은 동일한 IntPtr intptr에서 여러 번 마우스를 클릭하는 것이 아닙니다.내가 원하는 것은 다른 IntPtr intptr에 여러 클릭 이벤트가있는 것입니다. 서로 간섭하지 않고. 내 첫 번째 시도는 마우스 포인터를 이동하고 클릭을 preform하는 것이 었습니다. 이것은 당신이 이것을 수행하는 하나의 프로세스만을 가질 때 잘 작동합니다. 여러 스레드가 다른 위치를 클릭하려고하면 실패합니다. – VbN

0

난 당신이 전화로 더 핸들을 설정 한 경우 handle

public static void MouseLeftClick(Point p, int handle = 0) 
{ 
    //build coordinates 
    int coordinates = p.X | (p.Y << 16); 
    //send left button down 
    SendMessage(handle, 0x201, 0x1, coordinates); 
    //send left button up 
    SendMessage(handle, 0x202, 0x1, coordinates); 
} 

에서 왼쪽 버튼을 클릭하여이 코드를 사용 핸들의 창으로 메시지가 전송되고 윈도우 좌표를 설정해야합니다.

3
내가 최근에 C#에서 마우스 클릭을 시뮬레이션하려고했다

, 나는 트릭 할이 작은 헬퍼 클래스를 작성 :

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

    [Flags] 
    public enum MouseEventFlags : uint 
    { 
     Move = 0x0001, 
     LeftDown = 0x0002, 
     LeftUp = 0x0004, 
     RightDown = 0x0008, 
     RightUp = 0x0010, 
     MiddleDown = 0x0020, 
     MiddleUp = 0x0040, 
     Absolute = 0x8000 
    } 

    public static void MouseEvent(MouseEventFlags e, uint x, uint y) 
    { 
     mouse_event((uint)e, x, y, 0, UIntPtr.Zero); 
    } 

    public static void LeftClick(Point p) 
    { 
     LeftClick((double)p.X, (double)p.Y); 
    } 

    public static void LeftClick(double x, double y) 
    { 
     var scr = Screen.PrimaryScreen.Bounds; 
     MouseEvent(MouseEventFlags.LeftDown | MouseEventFlags.LeftUp | MouseEventFlags.Move | MouseEventFlags.Absolute, 
      (uint)Math.Round(x/scr.Width * 65535), 
      (uint)Math.Round(y/scr.Height * 65535)); 
    } 

    public static void LeftClick(int x, int y) 
    { 
     LeftClick((double)x, (double)y); 
    } 
} 

좌표가 조금 이상한 65535의 일부분이있다, 그러나이 수업이 당신을 위해 그것을 처리 할 것입니다.

+0

"최근에"이 작업을 수행 한 경우 왜 사용되지 않는 [mouse_event' 함수] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646260.aspx) 대신 권장 ['SendInput' 기능] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx)? –

+1

@CodyGray : SendInput을 사용할 수 없습니다. 이 OTOH는 완벽하게 작동했습니다. SendInput을 사용하여 픽셀 단위로 화면 좌표에서 마우스 클릭을 보내는 C# 예제가 있다면 ...보고 싶습니다. – mpen