Winapi 使用SendInput时无法合成右键单击 我使用WiAPI,用C++,我想用StEnPixt做一个右击模拟,但是我不确定什么地方出了问题。

Winapi 使用SendInput时无法合成右键单击 我使用WiAPI,用C++,我想用StEnPixt做一个右击模拟,但是我不确定什么地方出了问题。,winapi,Winapi,我的测试程序应该是这样工作的:当我按下鼠标中键时,它会执行右键单击 #include <iostream> #include <windows.h> #include <stdio.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { // Fetch tab key state. w

我的测试程序应该是这样工作的:当我按下鼠标中键时,它会执行右键单击

#include <iostream>
#include <windows.h>
#include <stdio.h>

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)     
{
    // Fetch tab key state.

    while (1)   
    {
        SHORT tabKeyState = GetAsyncKeyState(4); // Mouse mid button

        // Test high bit - if set, button was down when GetAsyncKeyState was called.
        if (tabKeyState < 0)
        {
            INPUT    Input[2] = { 0 };
            // left down 
            Input[0].type = INPUT_MOUSE;
            Input[0].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
            Input[0].mi.time = 500;

            // left up

            Input[1].type = INPUT_MOUSE;
            Input[1].mi.dwFlags = MOUSEEVENTF_RIGHTUP;
            Input[1].mi.time = 500;

            ::SendInput(2, Input, sizeof(INPUT));
        }
    }
    return 0;
}
#包括
#包括
#包括
int WINAPI wWinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、PWSTR pCmdLine、int nCmdShow)
{
//获取选项卡键状态。
而(1)
{
短tabKeyState=GetAsyncKeyState(4);//鼠标中键
//测试高位-若设置,则在调用GetAsyncKeyState时按钮已关闭。
如果(tabKeyState<0)
{
输入[2]={0};
//左下
输入[0]。类型=输入\鼠标;
输入[0]。mi.dwFlags=MOUSEEVENTF_RIGHTDOWN;
输入[0]。mi.time=500;
//左起
输入[1]。类型=输入\鼠标;
输入[1]。mi.dwFlags=MOUSEEVENTF_RIGHTUP;
输入[1]。mi.time=500;
::SendInput(2,Input,sizeof(Input));
}
}
返回0;
}

在设置第二条事件记录属性的代码中,使用索引0而不是索引1

Input[1].type = INPUT_MOUSE;
Input[0].mi.dwFlags = MOUSEEVENTF_LEFTUP;
Input[0].mi.time = 100;
在最后两行中使用索引1而不是0

顺便说一下,像这样编写if语句更容易

if (tabKeyState < 0)
if(tabKeyState<0)

我使用睡眠来解决这个问题,我发现sendinput不起作用,因为我在VS中执行此操作。这个问题现在可以关闭。

我的错,我在这里手动编写了此代码,但没有注意到错误,但是在我的机器上编写的代码是可以的,并且由于文章中描述的问题,我无法模拟右键单击。我已经更新了帖子,我们无法回答关于我们看不到的代码的问题。不要显示假代码。你的代码劫持处理器核心,使其进入无休止的循环,只是为了检查一些输入。用鼠标钩子代替。为什么要将时间设置为任意值?我想在按下和按下之间留出一个间隙releasing@BarmakShemirani谢谢你observation@GugaLoks您不能使用
mi.time
字段进行此操作。您需要在对
SendInput()
的多个调用之间拆分事件,并在它们之间设置延迟,例如使用
Sleep()
关闭它。或者最好删除它。你是提问者,你有权自己提问。