繁体   English   中英

无法使用:: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM