SendMessage不适用于C#

时间:2011-01-21 10:57:21

标签: winforms winapi pinvoke

我正在尝试在我的应用程序的活动窗口上打印字母“a”:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

...

// global hotkey handler
void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
    var hWnd = GetForegroundWindow();

    SendMessage(hWnd, (uint)WM.KEYDOWN, (int)VK.KEY_A, 0);
    SendMessage(hWnd, (uint)WM.KEYUP, (int)VK.KEY_A, 0);
 }

但是信件没有出现在活动窗口中(对于任何应用程序)。有人能帮助我吗?

2 个答案:

答案 0 :(得分:2)

发送WM_KEYDOWN和WM_KEYUP不起作用,尤其是对于字符键。应用程序的消息泵调用TranslateMessage,它为这些键生成WM_CHAR。应用程序通常在WM_CHAR中查找字符输入。

注入输入的正确方法是使用SendInput函数。

这是我通过Google搜索找到的SendInput wrapper

答案 1 :(得分:2)

您必须使用PostMessage,而不是SendMessage。您的pinvoke声明也是错误的,返回值和最后两个参数是IntPtr,而不是int。

最终的失败是您无法控制修改键的状态,Ctrl,Shift和Alt。这使得它随机失败,这取决于用户是否按下其中一个键。需要SendInput,迫使您现在也可以通过SetForegroundWindow()获得正确的焦点。在Winforms应用程序中使用SendKeys。

要注入输入键,您可以使用SendMessage()发送WM_CHAR。