【问题标题】:SendMessage doesn't work from C#SendMessage 在 C# 中不起作用
【发布时间】:2011-01-21 10:57:20
【问题描述】:

我正在尝试在我的应用程序的活动窗口上打印字母“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);
 }

但字母不会出现在活动窗口中(对于任何应用程序)。有人可以帮帮我吗?

【问题讨论】:

    标签: winforms winapi pinvoke


    【解决方案1】:

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

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

    这是我通过谷歌搜索找到的SendInput wrapper。

    【讨论】:

    • 感谢您的重播。我找到了 [DllImport("user32.dll")] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
    【解决方案2】:

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

    最终的缺点是您无法控制修饰键 Ctrl、Shift 和 Alt 的状态。这会导致随机失败,具体取决于用户是否按下了其中一个键。 SendInput 是必需的,迫使您现在也使用 SetForegroundWindow() 获得正确的焦点。在 Winforms 应用中使用 SendKeys。

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

    【讨论】:

    • SendKeys +1。当然,在 OP 的上一个问题中,他被建议不要使用 SendKeys,而只是使用 SendMessage 将文本直接插入编辑框,大概是使用 WM_SETTEXT。但是OP似乎误解了这一点......
    • 是的,这不是一个好建议。正确的答案是发送 WM_COPY。
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多