Задать вопрос
@Sratimon

SendMessage как послать клик по координатам не активного окна? или найти замену?

Уже 3 дня рою форумы но не как не могу послать клик по координатам в неактивное окно к примеру пэинт.
Перепробовал куча вариантов и совсем запутался !
HWND wnd1 = FindWindow(TEXT("MSPaintApp"),TEXT("Безымянный - Paint"));
//или
HWND wnd1 = FindWindow(NULL,"Безымянный - Paint");
//или
HWND wnd1 = FindWindow("MSPaintApp","Безымянный - Paint");
//или
HWND wnd1 = FindWindow("MSPaintApp",NULL);
//пробовал по разному 
SendMessage (wnd1, WM_LBUTTONDBLCLK, 0, MAKELPARAM(560, 425));
//тут тоже кучу вариантов испробовал


Ну не как не хочет кликать в пэинт так же пробовал с калькулятором и другими приложениями.
Максимум что у меня вышло кликнуть в окно wow и то при условии что там была мышка .

Собственно просьба напишите программу которая кликает по координатам в неактивном окне пэинта .

И какие есть еще альтернативы для клика по неактивному окну ?
(Пояснение не обязательно к прочтению).
Объясню зачем мне это буду открыты сразу более 3 окон игры в которых надо совершать одновременно(желательно но не обязательно ) клики по одним и тем же координатам. К примеру раз в 30 сек. в координаты х=100 у=300.
Да можно сделать просто обычный кликер который будет переключаться между окнами но если окон будет 10-20+ то он просто не успеет.
  • Вопрос задан
  • 4918 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
AxisPod
@AxisPod
Для начала я бы посоветовал посмотреть какие сообщения летят в Spy++ и сдать такую же пачку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
maaGames
@maaGames
Погроммирую программы
FindWindow находит дескриптор окна приложения и клик посылается именно в него, а нужно посылать в окно "вида". Запусти spy (в комплекте со студией ставится) и скопируй дескриптор окна с канвой. Нажать бинокль и перетащить "прицел" на канву в открытом пэйнте - окно обведётся квадратиком. Затем вставь дескриптор в код:
HWND wnd1 = (HWND)0x000704EC;

	::SendMessage( wnd1, WM_LBUTTONDOWN, 0, MAKELPARAM( 100, 100 ) );
	::SendMessage( wnd1, WM_LBUTTONUP, 0, MAKELPARAM( 100, 100 ) );


После этого можешь попробовать из дескриптора окна приложения добраться до дочернего окна, с которым требуется взаимодействовать. Так же через spy посмотри, есть ли дочерние окна в игре.
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
1. WM_LBUTTONDBLCLK это дабл клик.
а. А он в программе может и не обрабатываться, особенно если окно не имеет флага CS_DBLCLKS
б. Многие программы его игнорируют и сами определяют по интервалу между получением WM_LBUTTONDOWN. (GetDoubleClickTime)
2. FindWindow вы получаете главное окно программы и в его обработчик засылаете сообщение. А как правило главное окно никак на клики и не реагирует, клик нужен дочерним окнам.
3. Если вы хотите эмулировать клик мыши в любом месте экрана, то нужно использовать функцию mouse_event (устарела) или SendInput. Тогда сообщение от мыши может попасть с очередь сообщений приложения и далее правильно попадет дочернему элементу, если такой в нужном месте имеется.
Ответ написан
Комментировать
@Sratimon Автор вопроса
AxisPod AxisPod большое спасибо за совет он очень помог !
реализовал я это так Spy++ поставил в журнале галочку на мышку
получил данные после клика ну и в итоге вышло
SendMessage(hidSL, WM_LBUTTONDOWN, 0x00000001, 0x0167027F);
SendMessage(hidSL, WM_LBUTTONUP, 0x00000000, 0x0167027F);
как понимаю это координаты 0x0167027F
0x00000001 что это такое есть идеи но лучше оставлю их при себе =)
maaGames maaGames
SendMessage( wnd1, WM_LBUTTONDOWN, 0, MAKELPARAM( 100, 100 ) ); это у меня не работало !
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы