【问题标题】:Sendkey Function Enter Key IssueSendkey 功能 Enter 键问题
【发布时间】:2014-11-24 10:38:01
【问题描述】:

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

现在,我猜这个回车键可能有 3 个问题,

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

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

  3. 回车键、回车键、回车键或其他所谓的键盘键的超级明星都不能像其他按钮那样工作,所以我的代码不适合它

注意:如果它是 1 ,请您启发我如何以编程方式为给定按钮获取键码的正确值,而不依赖于 msdn vk list 等静态资源

这里是我的sn-p

我创建了一个这样的输入结构并将其分配为键盘输入

             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}”参数

【问题讨论】:

  • 您要发送的目标是什么?您是否通过在键盘上按下来检查目标是否真的对 RETURN 做出反应?
  • 据我所知,发送输入是一个非常接近机器功能的低级别,它几乎可以直接与隐藏驱动程序对话,就像它是一个真正的键盘一样,并且可以在每个目标上全局工作,例如,如果模拟 win+d 一切都会最小化,而且输入键工作得很好,我想我在发布我的问题而无法使用它时会遇到一些问题:?无论如何感谢您的回复
  • 如果您发送 VK_RETURN,SendInput 会返回什么?

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


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,这个工具不仅可以帮助找出问题的原因,还可以帮助我处理程序的各个方面,使其更高效,我一直在寻找类似的东西,但最终发现了一些糟糕的垃圾软件,包括键盘记录器,似乎 msdn 总是有解决方案
【解决方案2】:

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

这是我的 spy++ 日志,首先是假的,然后是真正的 enter 按键,另一方面,真正的 enter 事件也发送一个字符消息,正如我们所知的“\n”,似乎字符消息不是由使用原始键事件消息接收它的进程提取的,正如 msdn 在 enter key case 中建议的那样

000804EA P WM_KEYDOWN nVirtKey:VK_PA1 cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 000804EA P WM_KEYUP nVirtKey:VK_PA1 cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0

000804EA P WM_KEYDOWN nVirtKey:VK_RETURN cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 000804EA P WM_CHAR chCharCode:'13' (13) cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多