为什么在这个SendMessage示例中没有keydown或keyup工作?

时间:2012-11-05 23:49:30

标签: c# dllimport sendmessage

我正在使用此代码

    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正在工作 - 为什么?

1 个答案:

答案 0 :(得分:-2)

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

如果你打算使用这样的Windows消息,那么学会使用Spy ++。如果你不知道那是什么,那么请通过熟悉VS Tools菜单中可用的工具来投入一分钟。

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