3 / 3 / 4
Регистрация: 13.05.2016
Сообщений: 38
1

Нажать на кнопку в стороннем приложении, используя WinAPI

01.11.2016, 14:25. Показов 5272. Ответов 2

Студворк — интернет-сервис помощи студентам
Здравствуйте
в кратце
Нужно на c# и winapi реализовать данное сообщение
"WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos: 386 yPos:227"
Handle мне известен, осталось разобраться с командой

а теперь подробно
У сторонней программы есть поле (допустим 500х500) и в нём по середине кнопка на которую мне необходимо нажать с помощью winapi.
Я смотрел через SPY++ и Ranorex, и они мне показывают кнопку и поле одним хэндлом.

Пробую для начала по полученному Handle отправить даблклик(есть такая функция, окно переходит в режим fullscreen)
C#
1
Usr32.PostMessage(winCanvas, Usr32.WM_LBUTTONDBLCLK, (IntPtr)1, IntPtr.Zero);
И оно срабатывает корректно. Замечательно, теперь надо реализовать клик по середине экрана.

Изучая через SPY++ программу смог найти "сообщение" которое получает программа во время клика по кнопке.
Вот оно: WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos: 386 yPos:227.

Нагуглил, что это можно отправить клик по координатам через MAKELPARAM
Вот код, который я пробовал реализовать
DllImport

C#
1
2
3
public const int WM_LBUTTONDOWN = 0x0201;
[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

C#
1
2
3
4
5
6
7
8
9
10
11
private int MAKELPARAM(Point coord)
{
int p = coord.X;
int p_2 = coord.Y;
return ((p_2 << 16) | (p & 0xFFFF));
}
 
//это я нахожу X,Y в который надо кликнуть
Point coordButton = new Point (this.Location.X + (this.Width / 2), this.Location.Y + (this.Height / 2));
//сама команда
PostMessage(winCanvas, WM_LBUTTONDOWN, (IntPtr)1, (IntPtr)MAKELPARAM(coordButton));
Буду рад объяснению решения моей проблемы/ошибки.
Ниже скриншоты окна с кнопкой/отрезок из SPY++.
И пожалуйста, я не просто так пишу в ветку c#, мне сложно будет переделать команды win api на с++ в команды на c#.
Миниатюры
Нажать на кнопку в стороннем приложении, используя WinAPI   Нажать на кнопку в стороннем приложении, используя WinAPI  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2016, 14:25
Ответы с готовыми решениями:

WinAPI: Как нажать кнопку в другом приложении, если в нем открыто модальное окно
В общем есть пару вопросов; 1) Как по заголоку окна узнать имя класса 2) int hwnd...

Как нажать на пункт в списке в стороннем приложении?
Запускаю стороннее приложение. Через WinApi получаю доступ к нему. В нем есть список с одинаковыми...

WinApi эмуляция клика в стороннем приложении
Решил попробовать сделать обыкновенный кликер ЛКМ для одного приложения, подскажите какие варианты...

Кликнуть на кнопку в стороннем приложении
int hwnd=0; IntPtr hwndChild=IntPtr.Zero; //Get a handle for the Calculator Application main...

2
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
01.11.2016, 14:36 2
Я хз но может быть поможет: Клик мышью через SendMessage
0
3 / 3 / 4
Регистрация: 13.05.2016
Сообщений: 38
02.11.2016, 11:47  [ТС] 3
попробовал
C#
1
2
SendMessage(winCanvas, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(coordButton.Y * 0x10000 + coordButton.X));
SendMessage(winCanvas, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(coordButton.Y * 0x10000 + coordButton.X));
тоже мимо

пытаюсь решить проблему методом тыка)) не понимая почему не работает

Добавлено через 20 часов 26 минут
Нашёл причину, почему код не работал.

неправильно Point coordButton = new Point (this.Location.X + (this.Width / 2), this.Location.Y + (this.Height / 2));
правильно Point coordButton = new Point(this.Width / 2, this.Height / 2);

И вот, рабочий код нажатия кнопки
C#
1
2
PostMessage(winCanvas, WM_LBUTTONDOWN, (IntPtr)1, MakeDWord(coordButton.X, coordButton.Y));
PostMessage(winCanvas, WM_LBUTTONUP, (IntPtr)1, MakeDWord(coordButton.X, coordButton.Y));
1
02.11.2016, 11:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2016, 11:47
Помогаю со студенческими работами здесь

Программно нажать кнопку на открытой в стороннем браузере веб-странице (cpp Builder 6)
Здравствуйте! Помогите разобраться с одной прикладной задачкой! Суть в следующем: допустим на...

Нажать на кнопку в другом приложении
Доброго дня! Из программы запускается процесс стороннего приложения, открывается вордовский...

Нажать кнопку в чужом приложении
Помогите нажать кнопку на &quot;левом&quot; приложение !!!!!

Как нажать кнопку в другом приложении
ситуация следующая... при запуске моей программы нужно что бы в другом приложении например...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru