C ++ Windows API MOUSEEVENTF_XDOWN, MOUSEEVENTF_XUP не работает - PullRequest
1 голос
/ 19 января 2020

Я пытался научиться использовать API c ++ Windows для отправки ввода мыши на windows, и это было здорово, но по какой-то причине, когда я пытаюсь использовать структуру mouseInput с dwflags, установленным в (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP), похоже, ничего не делает, все другие dwFlags, кажется, тоже работают. В документации сказано, что когда MOUSEEVENTF_XDOWN (или MOUSEEVENTF_XUP) используется как dwFlags, это должно вызывать нажатие или отпустите кнопку, хранящуюся в mouseData (например, XBUTTON1), но она ничего не делает, что-то не так с кодом? или я не правильно его использую? Я использую windows 10 64x

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


void clickMouse()
{
    INPUT event;
    MOUSEINPUT mouseInput = 
{
    0,
    0,
    XBUTTON1,
    (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP),
    0,
    NULL
};
event.type = INPUT_MOUSE;
event.mi = mouseInput;
SendInput(1, &event, sizeof(INPUT));

}

int main()
{
bool buttonPressed = false;
while (true)
{
    if (!buttonPressed && (GetKeyState(VK_CONTROL) >> 15))
    {
        clickMouse();
        buttonPressed = true;
    }
    else if (buttonPressed && !(GetKeyState(VK_CONTROL) >> 15))
    {
        buttonPressed = false;
    }
}

}

1 Ответ

2 голосов
/ 21 января 2020

Я внес небольшое изменение в ваш код (на это указывает Андреас), чтобы последовательно запускать события, как это сделал бы настоящий пользователь. Я использовал Chrome для цели, поместив мышь в любом месте окна. Похоже, по крайней мере на моем компьютере, WM_XBUTTONDOWN, за которым следует сообщение WM_XBUTTONUP, активирует кнопку возврата независимо от того, где находится мышь. Я также использовал Spy ++, чтобы убедиться, что это генерируемые сообщения. При указании 0,0 запускается событие в последней известной позиции мыши. Поскольку это кнопка X, вы должны найти приложение, которое реагирует на это событие, чтобы увидеть, что оно работает, или использовать Spy ++ или аналогичный инструмент, чтобы увидеть, что оно запускается. Вот код, который я использовал.

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


void clickMouse()
{
    INPUT event;
    MOUSEINPUT mouseInput[] =
{  
    {
    0,
    0,
    XBUTTON1,
    (MOUSEEVENTF_XDOWN),
    0,
    NULL
},
{
    0,
    0,
    XBUTTON1,
    (MOUSEEVENTF_XUP),
    0,
    NULL
}};
event.type = INPUT_MOUSE;
event.mi = mouseInput[0];
SendInput(1, &event, sizeof(INPUT));
event.mi = mouseInput[1];
SendInput(1, &event, sizeof(INPUT));
}

int main()
{
    bool buttonPressed = false;
    while (true)
    {
        if (!buttonPressed && (GetKeyState(VK_CONTROL) >> 15))
    {
        clickMouse();
        buttonPressed = true;
    }
    else if (buttonPressed && !(GetKeyState(VK_CONTROL) >> 15))
    {
        buttonPressed = false;
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...