3

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

我并不是说它被最小化了,例如,想象一下,你有 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);

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

4

4 回答 4

2

您可以尝试UI 自动化 API。它还支持遗留应用程序。

于 2009-04-30T13:58:45.410 回答
2

也许尝试使用 PostMessage 函数:

    [DllImport("user32.dll", CharSet=CharSet.Auto)] 
    private static extern int PostMessage(
            int hWnd, int msg, int wParam, IntPtr lParam);
于 2009-04-30T14:23:49.217 回答
1

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

于 2009-12-15T23:20:22.063 回答
0

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

于 2011-11-01T18:27:19.083 回答