无法使用:: SendInput()向Wordpad应用程序发送退格键

时间:2010-03-10 23:33:53

标签: c++ winapi qt4 keyboard sendinput

我使用了sendinput()函数和windows键盘钩子来开发印度语言的自定义键盘。 项目位于Google代码中:http://code.google.com/p/ekalappai

keyboad hook和sendinput函数放在win32 dll中。它们是从Qt exe调用的。 我们的应用程序适用于大多数键和应用程序。我发现了以下问题:

我无法将Backspace密钥发送到Wordpad / Openoffice / MsOffice等少数应用程序。我发现Arrowkeys和删除键的问题相同。

这是我的代码:

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

我尝试在谷歌搜索,但还不能解决问题。如果有人有解决这个帮助的线索。感谢。

2 个答案:

答案 0 :(得分:1)

您正在混合虚拟密钥和扫描代码。 wVk成员是重要成员,扫描代码仅用于虚拟键不明确。修正:

kb.wVk   = vk;
kb.wScan = 0;   // TODO: look at VkKeyScanEx()

答案 1 :(得分: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 ++来更好地了解发送给目标应用程序的关键消息以及它与点击文字退格时的不同之处。)