【问题标题】:Simulate Mouse move/click/keyPress in an application that is not active在未激活的应用程序中模拟鼠标移动/单击/按键
【发布时间】:2009-04-30 13:49:14
【问题描述】:

我知道如何模拟鼠标和键盘事件,但它们的行为就像用户做了它们一样,所以它们会影响活动的窗口。我需要的是模拟其中一个输入,但在一个不活动的窗口中。

我并不是说它是最小化的,例如,假设您有 msPaint 和记事本。记事本在油漆前面。并且您想在绘图窗口的某些坐标中模拟鼠标单击,但不将其设置为活动状态,从而使用户可以继续使用位于绘图前的记事本。

这可能吗?谢谢!

我试过了:

            const int WM_KEYDOWN = 0x100;
        Thread.Sleep(5000);
        Process x = Process.Start(@"C:\WINDOWS\NOTEPAD.EXE");
        PInvokes.PlatformInvokeUSER32.SendMessage(x.MainWindowHandle, WM_KEYDOWN, ((int)Keys.W), 0);

但它不起作用 =( 什么也没做 :(

【问题讨论】:

    标签: c# process keypress sendmessage


    【解决方案1】:

    你可以试试UI automation API。它还支持遗留应用程序。

    【讨论】:

      【解决方案2】:

      不妨试试 PostMessage 功能:

          [DllImport("user32.dll", CharSet=CharSet.Auto)] 
          private static extern int PostMessage(
                  int hWnd, int msg, int wParam, IntPtr lParam);
      

      【讨论】:

        【解决方案3】:

        根据目标应用,可能会有很多问题。某些应用程序在 WM_KEYDOWN 或 WM_KEYUP 而不是 WM_CHAR 上触发。此外,密钥可能已经关闭并被忽略。对于像网络浏览器这样的目标,您需要获得正确的窗口句柄。 Winspector 可以为您获取。

        【讨论】:

          【解决方案4】:

          您的代码将无法工作,因为 SendMessage 要求您发送的窗口处于活动状态。 试试 PostMessage。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-11-06
            • 1970-01-01
            • 1970-01-01
            • 2015-12-14
            • 1970-01-01
            • 1970-01-01
            • 2012-08-10
            相关资源
            最近更新 更多