C# 将模拟事件发送到另一个窗口

C# 将模拟事件发送到另一个窗口,c#,events,mouse,emulation,C#,Events,Mouse,Emulation,我通过以下方式将鼠标事件发送到另一个应用程序。问题是,这适用于某些应用程序,但不适用于其他应用程序。 为什么? 使用System.Runtime.InteropServices; 使用系统诊断; 命名空间WpfApplication1 { 公共部分类主窗口:窗口 { [DllImport(“user32.dll”)] 私有静态外部int SendMessage(IntPtr hWnd、uint Msg、IntPtr wParam、IntPtr lParam); private const int

我通过以下方式将鼠标事件发送到另一个应用程序。问题是,这适用于某些应用程序,但不适用于其他应用程序。 为什么?

使用System.Runtime.InteropServices;
使用系统诊断;
命名空间WpfApplication1
{
公共部分类主窗口:窗口
{
[DllImport(“user32.dll”)]
私有静态外部int SendMessage(IntPtr hWnd、uint Msg、IntPtr wParam、IntPtr lParam);
private const int downclick=0x201;
private const int upclick=0x202;
IntPtr handle=IntPtr.Zero;
公共主窗口()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
foreach(Process.getProcessByName(“mspaint”)中的进程p)
{
IntPtr handle=p.MainWindowHandle;
int X=50;
int Y=380;

IntPtr lParam=(IntPtr)((Y不,这不可能以任何可靠的方式实现-正如您在测试中发现的那样。鼠标消息只是输入的一部分。Windows保留输入状态,仅发送消息不会更新该输入状态。您还忽略了鼠标移动消息等

例如,在WinForms应用程序中,您可以使用MousePosition属性获取当前鼠标位置。发送消息不能模拟这种情况

此外,您不能将鼠标消息发送到主窗口句柄,您必须找到要单击的确切按钮,并将消息直接发送到正确的按钮

因此,如果应用程序只侦听鼠标消息,那么它可能会起作用。这将起作用,但如果不起作用,则不会起作用

他们支持的模拟鼠标点击的方法是函数。但这对最小化的应用程序不起作用。它实际上会贯穿整个Windows输入过程,并移动鼠标光标,这意味着应用程序必须在屏幕上可见

这里有一些信息,它讨论键盘事件,但类似的逻辑也适用:

不,这不可能以任何可靠的方式实现-正如您在测试中发现的那样。鼠标消息只是输入的一部分。Windows保留输入状态,仅发送消息不会更新该输入状态。您还忽略了鼠标移动消息等

例如,在WinForms应用程序中,您可以使用MousePosition属性获取当前鼠标位置。发送消息不能模拟这种情况

此外,您不能将鼠标消息发送到主窗口句柄,您必须找到要单击的确切按钮,并将消息直接发送到正确的按钮

因此,如果应用程序只侦听鼠标消息,那么它可能会起作用。这将起作用,但如果不起作用,则不会起作用

他们支持的模拟鼠标点击的方法是函数。但这对最小化的应用程序不起作用。它实际上会贯穿整个Windows输入过程,并移动鼠标光标,这意味着应用程序必须在屏幕上可见

这里有一些信息,它讨论键盘事件,但类似的逻辑也适用:

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