C++ 使用PostMessage将文本发送到非活动窗口可以';但我不派班车

C++ 使用PostMessage将文本发送到非活动窗口可以';但我不派班车,c++,windows,C++,Windows,好的,我创建了一个非常简单的SendText函数 void SendText(string str) { for (std::string::iterator it = str.begin(); it != str.end(); ++it) { PostMessage(h, WM_KEYDOWN, VkKeyScan(*it), 0); } return; } 问题很明显,但解决办法却不是这样。如果发送字符串 你好,世界 输出的文本

好的,我创建了一个非常简单的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 world1”

然而,这个应用程序处理我的消息的方式,我无法简单地检查是否需要按住shift并发送VK_shift消息。基本上,该应用程序不处理KEYDOWN和keydup消息,它只是将它们视为按键事件

因此,它会变成按下/释放换档。。。。。按键按下/释放。。。按下/松开换档按钮

目标是:


以某种方式使用单个postmessage向应用程序发送正确的移位或未移位字符。或者可能还有其他想法,比如为什么按键向下/按键向上转换为按键按下。而且它必须能够在后台处理(alano send input)

如评论中所述,您的项目可能不是Unicode。
把这个从我的一个项目中拿出来,发送密钥现在应该可以工作了

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


如果任何人有直接的解决方案将Shift发送到后台窗口,请随意留言,我将编辑我的答案。

不要这样做。改用SendInput。这里:SDENTINT不能用于后台进程:(编辑我的最后一行来说明我也要说后台进程。你应该用OS或工具包等的内容来标记这个问题:它不是关于便携C++的。@ Tyyd -你知道Windows(或工具包)的不同版本之间有什么不同吗?当模拟输入时,@ HunZFrSP:从字面上来说,提供输入的方式与标准C++无关。