【问题标题】:Both Java and C++ Refuse to Emulate Arrow Keys?Java 和 C++ 都拒绝模拟箭头键?
【发布时间】:2015-07-15 17:24:35
【问题描述】:

好的,所以。这让我彻底疯了。我正在用 Java 构建一个应用程序,它需要模拟键盘键。就像,我想欺骗整个计算机,让他们认为正在按下一个键。 (别担心,我的意图不是恶意的 :P )问题是,我使用 Java 的 Robot 类来模拟按键,并且有一个错误,不允许在某些应用程序中按下箭头键,无论出于何种原因。

所以我想我会制作一个小型 C++ 程序来处理输入模拟并从 Java 中调用它。但问题是:箭头键仍然不适用于某些程序。就像,它只是没有注册。据我所知,它们是不适用于 Java 的相同程序。

有没有什么方法可以在所有程序中 100% 地模拟箭头键按下?目前我对任何语言都持开放态度。

这是我目前拥有的 C++ 程序,如果重要的话。

#define WINVER 0x0500
#include <windows.h>
#include <iostream>
#include <cstring>

int main()
{
    INPUT ip;

    Sleep(2000);

    ip.type = INPUT_KEYBOARD;
    ip.ki.wScan = 0;
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;

    ip.ki.wVk = VK_RIGHT;
    ip.ki.dwFlags = 0;
    SendInput(1, &ip, sizeof(INPUT));

    Sleep(1000);

    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));

    return 0;
}

我真的希望有人可以帮助我,因为我没有想法。

【问题讨论】:

  • 可能是他们没有使用正常的方式接收键盘输入。也许他们使用直接输入或其他 api 进行键盘访问。
  • 我读过一些关于它的东西,但如果是这样的话,我不知道如何解决它......
  • 如果您真的非常需要它,可能会模拟键盘驱动程序

标签: java c++ keyboard simulate


【解决方案1】:

如果重要的是它适用于 Windows 中的所有应用程序,您可能必须编写一个模拟 HID 的驱动程序 - 在 Windows 中安装和注册您的驱动程序作为键盘。 听起来工作量很大,但微软有 Windows 驱动程序工具包,在 Windows 驱动程序工具包示例包中,您可以查看一些有趣的示例:https://msdn.microsoft.com/en-us/library/ff554118(v=vs.85).aspx

由于你的 C++ 程序,我假设你只需要它在 Windows 上工作。

【讨论】:

  • 抱歉回复晚了。我对这种方法的担忧(我可能应该提到过)是我正在将这个程序分发给其他人。我对司机的经验为零,所以这很容易给其他人吗?
  • 我从未编写过驱动程序,但我相信将其提供给其他人将是您最不担心的事情。编写它应该是最糟糕的噩梦,获得认证(除非你可以忍受警告/手动安装)也可能非常困难......但也许这不是不可能的?有一个样本,那么它有多难? :)
  • 我不认为我会打扰。这只是一个小程序,无需与驱动程序混淆。不过谢谢!
【解决方案2】:

您确实可以使用 C++ 使用 SendKeys 类来做到这一点。详见链接here的文章。

【讨论】:

    【解决方案3】:

    keybd_event() 虽然 已弃用 是另一个合成按键的函数。只要目标程序具有焦点,键码就会显示在键盘记录器上。模拟开始菜单按键就这么简单-

    #include<iostream>
    #include<windows.h>
    
    using namespace std; 
    
    
    int main(){
        cout<<"Standby : Simulating start menu key press \n\n";
    
        keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
    
        return 0;
    }
    

    要模拟上下方向键,试试这个:

    // simulate RIGHT key press 
    keybd_event(VK_RIGHT,0,0,0);
    keybd_event(VK_RIGHT,0,KEYEVENTF_KEYUP,0);
    
    // simulate LEFT key press 
    keybd_event(VK_LEFT,0,0,0);
    keybd_event(VK_LEFT,0,KEYEVENTF_KEYUP,0);
    
    // simulate UP key press 
    keybd_event(VK_UP,0,0,0);
    keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);
    
    // simulate DOWN key press 
    keybd_event(VK_DOWN,0,0,0);
    keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
    

    keybd_event(已弃用):https://msdn.microsoft.com/en-us/library/ee504289.aspx

    keybd_event : https://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx

    虚拟键码:https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

    【讨论】:

    • 感谢您的建议,但它似乎与我当前的方法具有相同的结果。箭头键不适用于某些应用程序。
    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 2010-09-05
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2013-03-07
    相关资源
    最近更新 更多