模拟鼠标移动/单击/按下非活动应用程序中的按钮

时间:2009-04-30 13:49:14

标签: c# process keypress sendmessage

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

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

答案 0 :(得分:2)

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

答案 1 :(得分:2)

也许尝试使用PostMessage函数:

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

答案 2 :(得分:1)

根据目标应用,可能存在很多问题。某些应用程序触发WM_KEYDOWN或WM_KEYUP而不是WM_CHAR。此外,密钥可能已经关闭并被忽略。对于像webbrowsers这样的目标,你需要获得正确的窗口句柄。 Winspector可以帮你。

答案 3 :(得分:0)

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