Я создал устройство, похожее на wiimote, и я хочу использовать его как мышь в Windows (8.1).
Устройство подключается через tcp к программе c32 win32 на моем компьютере с Windows и отправляет позицию, в которой должен перемещаться курсор мыши. Я использую функцию SetCursorPos для установки позиции, которая прекрасно работает для управления большинством программ. Но когда я пытаюсь управлять, например, диспетчером задач, курсор больше не двигается. Когда я переключаюсь из диспетчера задач обратно в другую программу, она снова работает. Я также пытался использовать функцию SendInput с теми же результатами.
Вот как выглядит мой код с SendInput:
INPUT Input = { 0 };
Input.type = INPUT_MOUSE;
Input.mi.dx = (LONG)posX;
Input.mi.dy = (LONG)posY;
// set move cursor directly
Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
SendInput(1, &Input, sizeof(INPUT));
С SetCursorPos это всего одна строка:
SetCursorPos(posX, posY);
Кто-нибудь может сказать мне, почему это не работает для некоторых программ? Я знаю, что это должно быть возможно, поскольку я попробовал приложение для смартфона, которое управляет курсором, и оно работало во всех программах.
Вы не можете установить позицию курсора или ввести окно, которое требует более высоких прав, чем ваша программа.
Если вы хотите, чтобы ваша программа могла перемещать курсор над диспетчером задач, вам требуются те же привилегии, что и у диспетчера задач: Права администратора.
Вот как это делается в Windows 8+.
Я попробовал это со следующим:
int main()
{
HWND window = FindWindow("TaskManagerWindow", "Task Manager");
if (window)
{
RECT rect = {0};
GetWindowRect(window, &rect);
SetForegroundWindow(window);
SetActiveWindow(window);
SetFocus(window);
Sleep(300);
SetCursorPos(rect.right - 200, rect.bottom - 200);
}
return 0;
}
Курсор перемещается только через диспетчер задач, когда запускается от имени администратора. Это одинаково для всех контекстных меню и окон в Windows 8+. Не просто диспетчер задач.
#include <Windows.h>
int main()
{
SetCursorPos(200, 200);
return 0;
}