[英]Reading UTF-8 file, passing contents to other application using SendInput
[英]Could not send backspace key using ::SendInput() to wordpad application
我已经使用sendinput()函数和Windows键盘挂钩为印度语言开发了自定义键盘。 专案位于Google程式码中: http : //code.google.com/p/ekalappai
键盘挂钩和sendinput函数放置在win32 dll中。 然后从Qt exe调用它们。 我们的应用程序适用于大多数键和应用程序。 我发现以下问题:
我无法将Backspace密钥发送到几个应用程序,例如Wordpad / Openoffice / MsOffice。 我发现箭头键和删除键存在相同的问题。
这是我的代码:
extern "C" __declspec(dllexport) void GenerateKey(int vk , bool bExtended)
{
//update previous characters
previous_2_character = previous_1_character;
previous_1_character = vk;
KEYBDINPUT kb={0};
INPUT Input={0};
//keydown
kb.wVk = 0;
kb.wScan = vk;/*enter unicode here*/;
kb.dwFlags = KEYEVENTF_UNICODE; // KEYEVENTF_UNICODE=4
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
::SendInput(1,&Input,sizeof(Input));
//keyup
kb.wVk = 0;
kb.wScan = vk;/*enter unicode here*/;
kb.dwFlags = KEYEVENTF_UNICODE|KEYEVENTF_KEYUP; //KEYEVENTF_UNICODE=4
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
::SendInput(1,&Input,sizeof(Input));
}
完整的dll代码在这里: http : //code.google.com/p/ekalappai/source/browse/trunk/ekhook/ekhook/dllmain.cpp
调用代码:
generatekey = (GenerateKey) myLib->resolve( "GenerateKey" );
generatekey(44,FALSE); //comma - THis works in wordpad/MsOffice/Openoffice
generatekey(2949,FALSE); //tamil character "a" works in Wordpad/Msoffice/Openoffice
generatekey(8,FALSE); //backspace - This is NOT working in Wordpad/Msoffice/Openoffice
来自Qt Exe的完整调用代码位于: http : //code.google.com/p/ekalappai/source/browse/trunk/ekalappai/window.cpp
我尝试在Google中搜索,但无法解决问题。 如果有人对解决这个问题有帮助,请帮助。 谢谢。
您正在混合虚拟密钥和扫描代码。 wVk成员是重要的成员,只有虚拟密钥不明确时才使用扫描代码。 固定:
kb.wVk = vk;
kb.wScan = 0; // TODO: look at VkKeyScanEx()
该文件说:
如果指定了KEYEVENTF_UNICODE,则SendInput将WParam等于VK_PACKET的WM_KEYDOWN或WM_KEYUP消息发送到前台线程的消息队列。 一旦GetMessage或PeekMessage获得此消息,将消息传递给TranslateMessage就会发布WM_CHAR消息,该消息带有wScan最初指定的Unicode字符。
只是一个猜测,但是文字处理程序可能会触发WM_KEYDOWN / WM_KEYUP消息而不是WM_CHAR消息的退格行为。 因此,他们可能期望VK_BACKSPACE(而不是VK_PACKET)作为那些消息的wParam。 甚至可以使用基于VKEY而不是字符的加速器来完成...哎呀,您在Windows上,所以几乎所有可能。 :)
您是否尝试过不使用KEYEVENTF_UNICODE并执行kb.wVk = VK_BACKSPACE
?
(此外,您可以使用Spy ++更好地了解将哪些关键消息发送到目标应用程序,以及与击中文字退格键时的区别。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.