Симуляция перетаскивания с помощью SendInput C++

Кто-нибудь знает, как имитировать перетаскивание мышью с помощью SendInput на С++? Я хочу программно переместить значок на рабочий стол. Я ожидал, что последовательность (Переместите мышь к A)->(Нажмите левую кнопку вниз)->(Переместите мышь к B)->(Отпустите левую кнопку) будет работать, но это не так. Мышь перемещается к A, а затем к B, но значок не перемещается. Я думаю, что Drag'n'Drop (SHDoDragDrop()) не подходит для этой задачи - для работы требуются IDataObject и IDropSource. Благодарен за любые подсказки или идеи.


person YuriRzhanov    schedule 02.03.2021    source источник
comment
Пожалуйста, покажите фактический код, который вы пробовали, но он у вас не работает. Кроме того, рабочий стол представляет собой представление списка, так что вы могли бы использовать ListView_HitTest() и ListView_SetItemPositiion/32() вместо того, чтобы вообще манипулировать мышью.   -  person Remy Lebeau    schedule 02.03.2021


Ответы (2)


Извините, это не ответ - просто фрагмент кода, который я пытался достичь своей цели. Цель может быть достигнута разными средствами, но меня интересует именно этот.

INPUT inputs[4] = { 0 };

inputs[0].type = INPUT_MOUSE;
inputs[0].mi.dx = (from.x * 65535) / screen_w; inputs[0].mi.dy = (from.y * 65535) / screen_h;
inputs[0].mi.mouseData = 0; inputs[0].mi.time = 0;
inputs[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

inputs[1].type = INPUT_MOUSE;
inputs[1].mi.dx = (from.x * 65535) / screen_w; inputs[1].mi.dy = (from.y * 65535) / screen_h;
inputs[1].mi.mouseData = 0; inputs[1].mi.time = 0;
inputs[1].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN;

inputs[2].type = INPUT_MOUSE;
inputs[2].mi.dx = (to.x * 65535) / screen_w; inputs[2].mi.dy = (to.y * 65535) / screen_h;
inputs[2].mi.mouseData = 0; inputs[2].mi.time = 0;
inputs[2].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

inputs[3].type = INPUT_MOUSE;
inputs[3].mi.dx = (to.x * 65535) / screen_w; inputs[3].mi.dy = (to.y * 65535) / screen_h;
inputs[3].mi.mouseData = 0; inputs[3].mi.time = 0;
inputs[3].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP;

UINT uSent = SendInput(4, inputs, sizeof(INPUT));
person YuriRzhanov    schedule 04.03.2021

Ответ прост - SendInput() должен вызываться один за другим для каждого действия. Также после каждого вызова может понадобиться ненадолго добавить Sleep(). Обычно работает аргумент 10, но иногда системе требуется более длительный сон.

person YuriRzhanov    schedule 16.03.2021