所以这是我的问题,我一直在尝试使用sendinput()函数模拟各种关键事件,我甚至编写了函数来模拟复杂的关键事件,如winkey + D,alt + f4等使用该函数,无论如何 一切正常,直到我决定尝试使用这个很好的msdn list VK代码提供的虚拟键码VK_RETURN返回的回车键返回,但事实是它不起作用
现在,我猜这个输入密钥可能有3个问题,
输入的虚拟键码和pc键盘实际使用的值不一样
代码拼写错误代码,错误调用等有问题; 我不太确定,因为发送输入适用于目前为止测试的其余密钥
输入,返回马车,返回或任何被称为键盘键的超级明星不像其他按钮那样工作,所以我的代码不适合它
注意:如果它是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}”参数
答案 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