C++ перемещение мыши в windows с помощью SetCursorPos
Я создал устройство, похожее на wiimote, и я хочу использовать его как мышь в windows (8.1). Устройство подключается по tcp к программе c++ 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);
может кто-нибудь сказать мне, почему это не работает для некоторых программ? Я знаю, что это должно быть возможно, так как я попробовал приложение для смартфонов, которое управляет курсором, и оно работает во всех программах.
2 ответов
вы не можете установить позицию курсора или ввод окна, для которого требуются более высокие права, чем у вашей программы..
Если вы хотите, чтобы ваша программа могла перемещать курсор над диспетчером задач, вам требуются те же права, что и у диспетчера задач: права администратора.
вот как это делается в 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+. Не только Диспетчер задач.