2011-01-10 72 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

相关问题