1

我正在使用此代码

    const int WM_KEYDOWN = 256;
    const int WM_KEYUP = 257;
    const int WM_CHAR = 258;

    public static void SendKeys(string message){
        int foregroundWindowHandle = GetForegroundWindow();
        uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
        uint currentThreadId = GetCurrentThreadId();

        //AttachTrheadInput is needed so we can get the handle of a focused window in another app
        AttachThreadInput(remoteThreadId, currentThreadId, true);
        //Get the handle of a focused window
        int focused = GetFocus();
        //Now detach since we got the focused handle
        AttachThreadInput(remoteThreadId, currentThreadId, false);
        foreach (char c in message)
        {
            //SendMessage(focused, WM_CHAR, (int)c, null);
            SendMessage(focused, WM_KEYDOWN, 65, null);
            SendMessage(focused, WM_KEYUP, 66, null);
            SendMessage(focused, WM_CHAR, 67, null);
        }
    }

当我测试它时(例如,记事本处于活动状态),只有字母 C 打印,所以只有 WM_CHAR 工作 - 为什么?

4

1 回答 1

-1

首先,了解如何发送键盘消息的问题经常被问到。我假设您没有花费太多时间来寻找以前的答案。其次,了解初学者经常错误地认为发送键盘消息是最简单和最有效的解决方案。事实是,它通常不是最简单的,也不是最有效的,也不是最可靠的。

如果您要使用这样的 Windows 消息,那么请学习使用 Spy++。如果您不知道那是什么,请花一点时间熟悉 VS 工具菜单中的可用工具。

一个可能更简单、更有效和更可靠的解决方案通常是使用 WM_GETTEXT 和 WM_SETTEXT 消息。并预测未来的问题,按下另一个应用程序中的按钮会向按钮的父级发送 BN_CLICKED 通知。您可以使用 Spy++ 获得更多消息问题的答案。

于 2012-11-06T00:53:06.423 回答