Как я могу запустить сонар мыши (как на него ссылается MSDN) в Windows с помощью кода?

#c #windows #winapi #input

#c #Windows #winapi #ввод

Вопрос:

Дополнительная информация здесь: https://docs.microsoft.com/en-us/windows/win32/inputdev/about-mouse-input

Я пытаюсь создать программу для управления мышью и клавиатурой в Windows через контроллер Xbox One с помощью Xinput.h, и мне нужен способ легко показать, где находится мышь на экране, аналогично функции Windows «Mouse Sonar» (она обводит курсор кругами при нажатииCTRL).

Я попытался запустить сонар виртуальным нажатием клавиши, используя структуру ВВОДА, но это ничего не дает. Есть ли другой способ вызвать отображение кругов или есть лучший способ создать круги вообще?

 #include <stdio.h>
#include <Windows.h>
#pragma comment(lib, "user32.lib") 

int main()
{
SystemParametersInfoA(SPI_SETMOUSESONAR, 0, (bool *) *x, SPIF_UPDATEINIFILE);
Sleep(5000);
ZeroMemory(amp;input, sizeof(INPUT));
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_LCONTROL;
input.ki.dwFlags = 0; //0 for a keypress
SendInput(1, amp;input, sizeof(INPUT));
Sleep(100);
input.ki.dwFlags = KEYEVENTF_KEYUP; //this or 0x0002 for a key up
SendInput(1, amp;input, sizeof(INPUT));
Sleep(100);

cout << "Done";
x[0] = false;
SystemParametersInfoA(SPI_SETMOUSESONAR, 0, (bool *) *x, SPIF_UPDATEINIFILE);
return 0;
}
 

Пока это выполняется, во время сна (5000);, я могу нажать CTRL на клавиатуре, и появятся круги (пока настройка не будет отключена в конце int main). Но виртуальное нажатие клавиши ничего не делает. Любая помощь?

РЕДАКТИРОВАТЬ: исправлен приведенный выше код (он был извлечен из незавершенного проекта, и я забыл добавить несколько строк обратно). Но он по-прежнему работает не так, как я хочу (он не запускает сонар с помощью SendInput).

 #include <stdio.h>
#include <Windows.h>
#include <iostream>
#pragma comment(lib, "user32.lib")

INPUT input;
using namespace std;

int main()
{
SystemParametersInfo(SPI_SETMOUSESONAR, 0, (PVOID)1, SPIF_UPDATEINIFILE);
Sleep(5000);
ZeroMemory(amp;input, sizeof(INPUT));
input.type = INPUT_KEYBOARD;
input.ki.wVk = VK_LCONTROL;
input.ki.dwFlags = 0; //0 for a keypress
SendInput(1, amp;input, sizeof(INPUT));
Sleep(100);
input.ki.dwFlags = KEYEVENTF_KEYUP; //this or 0x0002 for a key up
SendInput(1, amp;input, sizeof(INPUT));
Sleep(100);

cout << "Done";
SystemParametersInfo(SPI_SETMOUSESONAR, 0, (PVOID)0, SPIF_UPDATEINIFILE);
return 0;
}
 

Комментарии:

1. Не уверен, какая у вас переменная x, но с SystemParametersInfo(SPI_SETMOUSESONAR, 0, (PVOID)1, SPIF_UPDATEINIFILE); вашим SystemParametersInfo(SPI_SETMOUSESONAR, 0, (PVOID)0, SPIF_UPDATEINIFILE); кодом все работает нормально, я вижу гидролокатор там, где находится мышь

2. Это не проблема, мой код работает в этом отношении. Я хочу запустить сонар в коде, виртуально. Я попытался с помощью структуры ВВОДА виртуально нажать клавишу CTRL, но это не сработало. Есть ли другой способ запустить его виртуально?

3. Ручное нажатие CTRL клавиши и запуск через SendInput оба варианта отлично сработали для меня. Есть ли что-нибудь, что вы пропустили?

4. Вы что-нибудь изменили в моем коде в исходном сообщении? (если вы это сделали, вставьте свою программу в комментарий)

5. Я также исправил код из моего исходного сообщения, проверьте его еще раз.