Java 按下Q键。过多的从属挂钩将影响操作性能

Java 按下Q键。过多的从属挂钩将影响操作性能,java,c#,c++,winapi,jna,Java,C#,C++,Winapi,Jna,如您所见,第一次按下Q按钮后,光标不会移回起始位置。 可以保存起始坐标。然后在需要时返回起始位置 Gif演示: 更新: 为了进一步帮助您解决问题,我将演示一些操作,供您参考 我们使用GetCursorPos获取ABC的坐标 A(267337)B(508334)C(714329) 然后将它们的坐标传递给输入结构,请参阅以下代码: #include <Windows.h> #include <iostream> UINT mouseAction(int x, int y

如您所见,第一次按下Q按钮后,光标不会移回起始位置。

可以保存起始坐标。然后在需要时返回起始位置

Gif演示:

更新:

为了进一步帮助您解决问题,我将演示一些操作,供您参考

我们使用
GetCursorPos
获取ABC的坐标

A(267337)B(508334)C(714329)

然后将它们的坐标传递给输入结构,请参阅以下代码:

#include <Windows.h>
#include <iostream>

UINT mouseAction(int x, int y, int flags)
{
    INPUT input;
    POINT pos;
    int x1 = GetSystemMetrics(SM_CXSCREEN);
    int y1 = GetSystemMetrics(SM_CYSCREEN);
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = flags;
    input.mi.time = NULL;
    input.mi.mouseData = NULL;
    input.mi.dx = x* (65536.0f / GetSystemMetrics(SM_CXSCREEN));
    input.mi.dy = y* (65536.0f / GetSystemMetrics(SM_CYSCREEN));
    input.mi.dwExtraInfo = GetMessageExtraInfo();

    return SendInput(1, &input, sizeof(INPUT));
}


int main()
{           
    while(1)
    {
        if (GetAsyncKeyState(0x51) & 0x0001)
        {
            mouseAction(267, 337, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
        }
        if (GetAsyncKeyState(0x57) & 0x0001)
        {
            mouseAction(508, 334, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
        }
        if (GetAsyncKeyState(0x45) & 0x0001)
        {
            mouseAction(714, 329, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
    //        mouseAction(267-87, 337-65, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
        }
    }

    return 0;
}

谢谢你的回答。不幸的是,我无法实现我需要的行为,我的单击是在错误的坐标上进行的,并且没有返回到原始位置。但我需要所有这些来实现在游戏中点击坐标。如果对你来说不难的话,请看我对这个问题的回答。也许你可以提出一些建议。多谢各位@格帕德,我检查过你的线了。请注意:您需要将获得的x和y坐标乘以
65536.0f/GetSystemMetrics(SM_CXSCREEN/SM_CYSCREEN)
。我已经在答复中解释了原因。此外,我将更新答案以帮助解决一些问题。非常感谢,现在我了解了它的工作原理:)谢谢你的回答。不幸的是,我无法实现我需要的行为,我的单击是在错误的坐标上进行的,并且没有返回到原始位置。但我需要所有这些来实现在游戏中点击坐标。如果对你来说不难的话,请看我对这个问题的回答。也许你可以提出一些建议。多谢各位@格帕德,我检查过你的线了。请注意:您需要将获得的x和y坐标乘以
65536.0f/GetSystemMetrics(SM_CXSCREEN/SM_CYSCREEN)
。我已经在答复中解释了原因。此外,我将更新答案以帮助解决一些问题。非常感谢,现在我了解了它的工作原理:)
UINT mouseAction(int x, int y, int flags)
{
    INPUT input;
    POINT pos;
    GetCursorPos(&pos);

    input.type = INPUT_MOUSE;
    input.mi.dwFlags = flags;
    input.mi.time = NULL; 
    input.mi.mouseData = NULL;
    input.mi.dx = (pos.x + x)*(65536.0f / GetSystemMetrics(SM_CXSCREEN));
    input.mi.dy = (pos.y + y)*(65536.0f / GetSystemMetrics(SM_CYSCREEN));
    input.mi.dwExtraInfo = GetMessageExtraInfo();

    return SendInput(1, &input, sizeof(INPUT));
}

void mouseMove(int x, int y)
{
    mouseAction(x, y, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
}
#include <Windows.h>
#include <iostream>

UINT mouseAction(int x, int y, int flags)
{
    INPUT input;
    POINT pos;
    int x1 = GetSystemMetrics(SM_CXSCREEN);
    int y1 = GetSystemMetrics(SM_CYSCREEN);
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = flags;
    input.mi.time = NULL;
    input.mi.mouseData = NULL;
    input.mi.dx = x* (65536.0f / GetSystemMetrics(SM_CXSCREEN));
    input.mi.dy = y* (65536.0f / GetSystemMetrics(SM_CYSCREEN));
    input.mi.dwExtraInfo = GetMessageExtraInfo();

    return SendInput(1, &input, sizeof(INPUT));
}


int main()
{           
    while(1)
    {
        if (GetAsyncKeyState(0x51) & 0x0001)
        {
            mouseAction(267, 337, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
        }
        if (GetAsyncKeyState(0x57) & 0x0001)
        {
            mouseAction(508, 334, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
        }
        if (GetAsyncKeyState(0x45) & 0x0001)
        {
            mouseAction(714, 329, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
    //        mouseAction(267-87, 337-65, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE);
        }
    }

    return 0;
}
mouseAction(267-87, 337-65, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE); // D(267-87, 337-65)