2011-01-10 3 views
1

다음과 같은 방법으로 다른 응용 프로그램에 마우스 이벤트를 보냅니다. 문제는 일부 응용 프로그램에서는 작동하지만 다른 응용 프로그램에서는 작동하지 않는다는 것입니다. 왜? 스파이를 사용에뮬레이트 된 이벤트를 다른 창으로 보내기

using System.Runtime.InteropServices; 
using System.Diagnostics; 



namespace WpfApplication1 
{ 

    public partial class MainWindow : Window 
    { 


    [DllImport("user32.dll")] 
    private static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 


    private const int downclick = 0x201; 
    private const int upclick = 0x202; 
    IntPtr handle = IntPtr.Zero; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     foreach (Process p in Process.GetProcessesByName("mspaint")) 
     { 
     IntPtr handle = p.MainWindowHandle; 
     int X = 50; 
     int Y = 380; 
     IntPtr lParam = (IntPtr)((Y << 16) | X); 
     IntPtr wParam = IntPtr.Zero; 
     SendMessage(handle, downclick, wParam, lParam); 
     SendMessage(handle, upclick, wParam, lParam); 
     } 
    } 
    } 
} 

는 ++ 나는 응용 프로그램에 다음과 같은 데이터를 받으면에 볼 :

<00062> 0004052C S WM_LBUTTONDOWN fwKeys:0000 xPos:50 yPos:380 
<00063> 0004052C R WM_LBUTTONDOWN 
<00064> 0004052C S WM_LBUTTONUP fwKeys:0000 xPos:50 yPos:380 
<00065> 0004052C R WM_LBUTTONUP 

나는 사건 자체가 올바른지 가정합니다. 하지만 일부 소프트웨어에서는 작동하는 이유는 모르지만 다른 소프트웨어에서는 작동하지 않습니다. 한 창에서 다른 창으로 마우스 메시지를 보내려면 어떻게합니까? 메시지를 보내려는 소프트웨어가 항상 표시되는 것은 아닙니다.

전혀 가능합니까?

답변

1

신뢰할 수있는 방법으로 테스트 할 수 없으므로 불가능합니다. 마우스 메시지는 입력의 한 부분 일뿐입니다. Windows는 입력 상태를 유지하고 메시지 만 보내면 해당 입력 상태가 업데이트되지 않습니다. 또한 마우스 이동 메시지 등을 무시합니다.

예를 들어 WinForms 응용 프로그램에서 MousePosition 속성을 사용하여 현재 마우스 위치를 가져올 수 있습니다. 보내는 메시지는이를 시뮬레이션 할 수 없습니다.

또한 마우스 메시지를 기본 창 핸들로 보낼 수 없기 때문에 클릭하려는 정확한 단추를 찾아 올바른 단추로 메시지를 직접 보내야합니다.

응용 프로그램이 마우스 메시지 만 듣고 있으면 제대로 작동하지만 어쩌면 작동하지 않을 수도 있습니다.

그들은 마우스 클릭을 시뮬레이트하는 방법을 지원, SendInput 기능입니다. 그러나 이는 최소화 된 응용 프로그램에서는 작동하지 않습니다. 이것은 문자 그대로 전체 Windows 입력 프로세스를 거쳐 마우스 커서를 움직입니다. 즉, 응용 프로그램이 화면에 표시되어야합니다. 여기

는 키보드 이벤트에 대해 이야기, 몇 가지 정보하지만 비슷한 논리가 적용 http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx http://blogs.msdn.com/b/oldnewthing/archive/2010/12/21/10107494.aspx

관련 문제