Sendkey功能输入密钥问题

时间:2014-11-24 10:38:02

标签: c++ visual-c++ sendinput

所以这是我的问题,我一直在尝试使用sendinput()函数模拟各种关键事件,我甚至编写了函数来模拟复杂的关键事件,如winkey + D,alt + f4等使用该函数,无论如何 一切正常,直到我决定尝试使用这个很好的msdn list VK代码提供的虚拟键码VK_RETURN返回的回车键返回,但事实是它不起作用

现在,我猜这个输入密钥可能有3个问题,

  1. 输入的虚拟键码和pc键盘实际使用的值不一样

  2. 代码拼写错误代码,错误调用等有问题; 我不太确定,因为发送输入适用于目前为止测试的其余密钥

  3. 输入,返回马车,返回或任何被称为键盘键的超级明星不像其他按钮那样工作,所以我的代码不适合它

  4. 注意:如果它是1,你可以请教我如何获得正确的键码值,以编程方式为给定的按钮而不依赖静态资源,如msdn vk list

    无论如何这是我的片段

    我创建一个像这样的输入结构并将其指定为键盘输入

                 INPUT Keybord;
             Keybord.type = INPUT_KEYBOARD;
             Keybord.ki.wScan = 0;
             Keybord.ki.time = 0;
             Keybord.ki.dwExtraInfo = 0;
    

    这里我指定一个按钮VK,我使用结构因为我也模拟了复杂的事件 在这种情况下,按键模拟功能可以正常工作并按下标签

     cndex[38].primary = VK_TAB;
    

    现在这里是麻烦制造者,我这样指定

     cndex[39].primary =  VK_RETURN;
    

    这是我的按键点击功能,第一个呼叫按下,第二个呼叫

            void Simple_press(int i){
         Keybord.ki.wVk = cndex[i].primary;
         Keybord.ki.dwFlags = 0;
         SendInput(1, &Keybord, sizeof(INPUT));
    
         Keybord.ki.dwFlags = KEYEVENTF_KEYUP;
         SendInput(1, &Keybord, sizeof(INPUT));
    
     };
    

    另一个注意事项是我不想使用sendKeys函数,它的缓慢和  它不适用于“{ENTER}”参数

2 个答案:

答案 0 :(得分:3)

如果您的应用程序有一个窗口,则可以使用spy ++工具查看SendInput命令发送的数据,如果目标还有一个窗口,您可以使用相同的工具查看是否以及发送给哪些消息它。它是实现这一目的的一个方便工具 - 它可以帮助或至少引导您朝着正确的方向前进。

http://msdn.microsoft.com/en-us/library/aa264396%28v=vs.60%29.aspx

答案 1 :(得分:1)

在使用间谍++进行一些简短的调查之后,好像我的键盘输入的虚拟代码不同,实际上它列为一些虚幻的PA1 ibm大型机使用的占位键,我在这样的大型机中调试我,无论如何,我四处搜索,我了解到你可以使用mapvirtualkey()将扫描码转换为更可靠的vk 和GetKeyboardLayout()(同一部分),有助于获取我的键盘类型并使用它而不依赖于静态资源。

这是我的间谍++日志首先是假的,然后是真正的输入按键,在另一个音符上,真正的输入 事件也发送了一个字符消息,就像我们所知道的那样,“/ n”似乎char消息不是由使用原始密钥事件消息接收它的进程提取的,如msdn在输入密钥的情况下建议的那样

< 000006> 000804EA P WM_KEYDOWN nVirtKey:VK_PA1 c重复:1 ScanCode:00 fExtended:0 fAltDown:0 < 000008> 000804EA P WM_KEYUP nVirtKey:VK_PA1 c重复:1 ScanCode:00 fExtended:0 fAltDown:0

< 000014> 000804EA P WM_KEYDOWN nVirtKey:VK_RETURN cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 < 000015> 000804EA P WM_CHAR chCharCode:'13'(13)c重复:1 ScanCode:1C fExtended:0 fAltDown:0