由SendInput()(Win32 API)传递的键盘输入在某些计算机上不起作用

时间:2015-09-02 11:38:21

标签: c++ winapi

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

我有一个库,通过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 ++变体,但两种变体行为相同 - 在我的机器上运行良好,但在其他机器上运行不正常)

是否有人遇到类似问题并知道解决方案需要做什么?

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

非常感谢

1 个答案:

答案 0 :(得分:0)

可能有一个应用程序窗口,它接收超出另一个窗口的击键,没有问题,但控件不完全可见。 帮助将目标widnow带到foregroud,使用ShowWindow应用于父窗口句柄,如下所示:

[CLANG Error] Unit3.cpp(15): no matching function for call to 'EnumWindows'
  winuser.h(9766): candidate function not viable: no known conversion from '<lambda at Unit3.cpp:15:14>' to 'WNDENUMPROC' (aka 'BOOL (*)(HWND, LPARAM) __attribute__((stdcall))') for 1st argument

然后发送所需的击键。