【问题标题】:Keyboard input passed by SendInput() (Win32 API) dont work on some computersSendInput() (Win32 API) 传递的键盘输入在某些计算机上不起作用
【发布时间】:2015-09-02 11:38:21
【问题描述】:

对不起,愚蠢的问题,但解决了这三天,没有看到任何进展。

我有一个库,它通过 Win32 API 发送有关鼠标点击和 SendInput 传递的键盘敲击序列的消息。

在我的计算机上一切正常(以及新安装的 W7 作为虚拟机),但在某些计算机上(我的客户和妻子的计算机)完全忽略 SendInput 并且不发送击键序列。

以下是部分相关代码:

extern "C" __declspec(dllexport) void __stdcall PutKeystroke(int times, BOOL isDown)
{
    INPUT ip = {0};
    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk =isDown? VK_DOWN : VK_UP;

    //std::vector<INPUT> ips;
    //ips.reserve((times*2)+2);
    INPUT ips[100] = {0};

    for(int i = 0; i < times*2; i+=2)
    {
        ip.ki.dwFlags = 0;
        ips[i] = ip;
        //ips.push_back(ip);

        ip.ki.dwFlags = KEYEVENTF_KEYUP;
        //ips.push_back(ip);
        ips[i+1] = ip;
    }

    ip.ki.dwFlags = 0;
    ip.ki.wVk = VK_RETURN;
    ips[times*2] = ip;
    //ips.push_back(ip);

    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    ips[(times*2)+1] = ip;
    //ips.push_back(ip);

    SendInput((times*2)+2, &ips[0], sizeof(INPUT));
}

(注释行是 C++ 变体,但两种变体的行为相同 - 在我的机器上运行良好,但在其他机器上不行)

这里有没有人遇到过类似的问题并且知道解决方案需要做什么?

当然,我尝试以管理员身份运行程序,但没有什么不同。

非常感谢

【问题讨论】:

  • 你不能使用自动化来代替伪造输入吗?
  • 您可能正在寻找UI Automation

标签: c++ winapi


【解决方案1】:

可能有一个应用程序窗口,它在另一个窗口之外接收击键,无论如何,但控件并不完全可见。 帮助将目标窗口带到前台,使用 ShowWindow 应用于父窗口句柄,如下所示:

ShowWindow(GetParent(clickSettings.GetHandler), SW_SHOW);

然后发送所需的击键。

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 2014-07-02
    • 2011-12-22
    • 1970-01-01
    • 2014-07-19
    • 2014-04-28
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多