使用PostMessage将文本发送到非活动窗口无法发送移位

Sending Text to a non-active window using PostMessage can't send shift though

本文关键字:窗口 PostMessage 文本 使用 非活动      更新时间:2023-10-16

好的,我创建了一个非常简单的SendText函数

void SendText(string str)
{
    for (std::string::iterator it = str.begin(); it != str.end(); ++it)
    {           
        PostMessage(h, WM_KEYDOWN, VkKeyScan(*it), 0);
    }
return;
}

这个问题很明显,但解决方法却不是。如果发送字符串

Hello World !

输出文本为"hello world1"…

然而,这个应用程序处理我的消息的方式,我无法简单地检查是否需要保持shift并发送VK_SHIFT消息。基本上,应用程序不处理KEYDOWN和KEYUP消息,它只是把它们当作按键事件。

所以它变成Shift Pressed/release .....按/放键…Shift按下/释放

目标:

以某种方式使用单个postmessage将正确的移位或未移位字符发送到应用程序。或者可能是其他关于为什么keydown/keyups只是被翻译为按键的想法。它必须能够在后台处理(不发送输入)

正如在注释中提到的,您的项目可能不是Unicode。
从我的一个项目中取出这个,发送密钥现在应该可以工作了。

永久链接

请注意,我在发送字符串(整个文本消息)时遇到了问题,因为窗口可能无法(能够)处理它们的速度与发送它们的速度一样快。键之间的小延迟可以解决这个问题。在我的项目中,我有一个用于发送文本的线程,使用std::队列(带互斥锁…)来完成所有文本。因此,对Sleep的简短调用不会太错,以防您有此线程。
你可以尝试不同的延迟,也总是取决于你的电脑。较旧的操作系统或较旧的计算机可能较慢,并且需要较高的延迟。您可以添加对操作系统/规格的检查,或者用户定义文本字符之间的延迟选项。

如果有人有直接的解决方案将Shift发送到背景窗口,请随时留下评论,我会编辑我的答案。