0

我使用了 sendinput() 函数和 windows 键盘挂钩来开发印度语言的自定义键盘。项目在谷歌代码中: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

我尝试在谷歌中搜索,但还没有找到解决方案。如果有人有解决此问题的线索,请提供帮助。谢谢。

4

2 回答 2

1

您正在混淆虚拟键和扫描码。wVk 成员是重要的成员,只有在虚拟键不明确时才会使用扫码。使固定:

kb.wVk   = vk;
kb.wScan = 0;   // TODO: look at VkKeyScanEx()
于 2010-03-11T00:09:54.473 回答
0

文档说:

如果指定了 KEYEVENTF_UNICODE,SendInput 将 WM_KEYDOWN 或 WM_KEYUP 消息发送到前台线程的消息队列,其中 wParam 等于 VK_PACKET。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++ 更好地了解哪些关键消息被发送到目标应用程序,以及它与按文字退格键时有何不同。)

于 2010-03-11T00:16:36.407 回答