Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 通过SendInput(Win32 API)的键盘输入不起作用,硬件输入起作用_Windows_Winapi_Browser_Input_Keyboard - Fatal编程技术网

Windows 通过SendInput(Win32 API)的键盘输入不起作用,硬件输入起作用

Windows 通过SendInput(Win32 API)的键盘输入不起作用,硬件输入起作用,windows,winapi,browser,input,keyboard,Windows,Winapi,Browser,Input,Keyboard,我有一项任务,我需要在浏览器中显示的web表单上单击鼠标,还需要进行一些键盘输入,如用数字填充文本框或按顺序按下箭头,以便在组合框中进行选择 我有窗口处理程序,也有单击的坐标,对我来说很好(非常简单的函数): 当我尝试发送键盘输入时出现问题,例如通过呼叫: extern "C" __declspec(dllexport) void __stdcall PutKeystrokeDown(int times) { INPUT ip; ip.type = INPUT_KEYBOARD;

我有一项任务,我需要在浏览器中显示的web表单上单击鼠标,还需要进行一些键盘输入,如用数字填充文本框或按顺序按下箭头,以便在组合框中进行选择

我有窗口处理程序,也有单击的坐标,对我来说很好(非常简单的函数):

当我尝试发送键盘输入时出现问题,例如通过呼叫:

extern "C" __declspec(dllexport) void __stdcall PutKeystrokeDown(int times)
{
    INPUT ip;
    ip.type = INPUT_KEYBOARD;
    ip.ki.time = 0;
    ip.ki.wVk = 0;
    ip.ki.dwExtraInfo = 0;

    ip.ki.wScan = VK_DOWN;

    for(int i = 0; i < times; i++)
    {
        ip.ki.dwFlags = KEYEVENTF_SCANCODE;
        SendInput(1, &ip, sizeof(INPUT));
        ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
        SendInput(1, &ip, sizeof(INPUT));
    }
    ip.ki.dwFlags = KEYEVENTF_SCANCODE;
    ip.ki.wScan = VK_RETURN;
    SendInput(1, &ip, sizeof(INPUT));
    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
}
extern“C”\uuuu declspec(dllexport)void\uuuu stdcall putKeystown(整数次)
{
输入ip;
ip.type=输入\键盘;
ip.ki.time=0;
ip.ki.wVk=0;
ip.ki.dwExtraInfo=0;
ip.ki.wScan=VK_DOWN;
for(int i=0;i
调用此函数后,未执行任何操作,仅在输入缓冲区中保留奇怪字符('''''[akcent,dead character])

当我试图捕捉Spy++所发生的事情时,鼠标事件(点击)被正确地检测到(当手动和程序生成时),但键盘事件(无论是程序还是手动)都没有

当我尝试在屏幕键盘上使用实用程序(Windows的常见部分)时,它的工作原理与硬件键盘一样好(输入了数字,更改了选择的值…),但没有生成任何消息

知道如何模拟硬件击键并将序列放在需要的位置吗?


非常感谢。

VK\u DOWN
VK\u RETURN
虚拟键,而不是扫描代码。因此,在调用
SendInput()
时,使用
ip.ki.wVk
字段而不是
ip.ki.wScan
字段,并去掉
KEYEVENTF\u SCANCODE
标志:

extern "C" __declspec(dllexport) void __stdcall PutKeystrokeDown(int times)
{
    INPUT ip = {0};
    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk = VK_DOWN;

    for(int i = 0; i < times; i++)
    {
        ip.ki.dwFlags = 0;
        SendInput(1, &ip, sizeof(INPUT));

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

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

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

VK_DOWN
VK_RETURN
虚拟键,而不是扫描代码。因此,在调用
SendInput()
时,使用
ip.ki.wVk
字段而不是
ip.ki.wScan
字段,并去掉
KEYEVENTF\u SCANCODE
标志:

extern "C" __declspec(dllexport) void __stdcall PutKeystrokeDown(int times)
{
    INPUT ip = {0};
    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk = VK_DOWN;

    for(int i = 0; i < times; i++)
    {
        ip.ki.dwFlags = 0;
        SendInput(1, &ip, sizeof(INPUT));

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

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

    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
}
你做错了。使用。你做错了。使用。
#include <vector>

extern "C" __declspec(dllexport) void __stdcall PutKeystrokeDown(int times)
{
    INPUT ip = {0};
    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk = VK_DOWN;

    std::vector<INPUT> ips;
    ips.reserve((times*2)+2);

    for(int i = 0; i < times; i++)
    {
        ip.ki.dwFlags = 0;
        ips.push_back(ip);

        ip.ki.dwFlags = KEYEVENTF_KEYUP;
        ips.push_back(ip);
    }

    ip.ki.dwFlags = 0;
    ip.ki.wVk = VK_RETURN;
    ips.push_back(ip);

    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    ips.push_back(ip);

    SendInput(ips.size(), &ips[0], sizeof(INPUT));
}