C# 使用PostMessage发送Unicode字符
我正在使用PostMessage向另一个应用程序中的flash对象发送输入。在我尝试发送unicode字符之前,它工作正常。在本例中: 迈克尔的书 撇号不是真正的那个,它不是ASCII 39,而是unicode U+2019。当它一次跨1个字符发送时,它将作为unicode值丢失,并作为构成unicode的原始字符着陆 迈克尔™书 如果我复制并粘贴到该窗口中,它会移动良好,如果我将文本文件加载到该窗口中,它会加载良好。因此,接收窗口能够接收unicode,但我发送它的方式一定不正确。任何帮助都将不胜感激C# 使用PostMessage发送Unicode字符,c#,unicode,user32,C#,Unicode,User32,我正在使用PostMessage向另一个应用程序中的flash对象发送输入。在我尝试发送unicode字符之前,它工作正常。在本例中: 迈克尔的书 撇号不是真正的那个,它不是ASCII 39,而是unicode U+2019。当它一次跨1个字符发送时,它将作为unicode值丢失,并作为构成unicode的原始字符着陆 迈克尔™书 如果我复制并粘贴到该窗口中,它会移动良好,如果我将文本文件加载到该窗口中,它会加载良好。因此,接收窗口能够接收unicode,但我发送它的方式一定不正确。任何帮助都将
private void SendKeysToForm(string Message)
{
for (int i = 0; i < Message.Length; i++)
{
PostMessage(hwnd, WM_CHAR, (IntPtr)Message[i], IntPtr.Zero);
}
}
private void sendKeysform(字符串消息)
{
for(int i=0;i
要发送Unicode,您需要使用PostMessageW
这是相同的方法签名,只需导入名称PostMessageW
并执行即可
更新
正如Hans所说,更好的方法是设置DllImport
的CharSet
:
[DllImport("user32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
private static extern bool PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
这将导致框架最终导入PostMessageW
谢谢你,汉斯 也许WM_UNICHAR会更有效。视情况而定,Adobe软件是,呃,特殊的。为什么要将字符发送为
IntPtr
而不是int?@HansPassant使用UTF-16位,WM_UNICHAR
用于UTF-32这不是重点。关键是该窗口是使用CreateWindowExA()还是CreateWindowsExW()创建的。在Spy++中可见。顺便说一句,如果您希望Ansi窗口仍然使用Unicode字符,那么WM_UNICHAR可能会起作用。但是可以肯定,@Mike很可能正确地猜到PostMessage没有正确声明。是否最好建议正确使用CharSet属性。@HansPassant,如果有办法的话,绝对可以!我只是在文档中没有看到任何东西来验证如何在wParam
中设置它。我错过了吗?[DllImport]属性的字符集属性。在99.99%的情况下,默认设置是错误的,因为你需要pinvoke一个winapi函数。哦,太好了,谢谢@HansPassant!我已经更新了答案。将CharSet属性添加到声明中解决了这个问题。各位