Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
#1

PostMessage. Найти ошибку в синтаксисе или алгоритме - Delphi WinAPI

21.02.2015, 17:36. Просмотров 810. Ответов 15
Метки нет (Все метки)

Да-да, знаю, уже миллион раз на форему поднимался вопрос и про дескрипторы, и про PostMeassage, и даже про имитацию нажатий мышью без использования курсора. Но я, вроде как, все эти знания уже почерпнул(да, я был на MSDN) и запилил кусок кода, который не выполняет своей функции, но и ошибки не выдаёт. Будьте добры, помогите. И будьте добры, не закидывайте отсылками к другим темам - я там был, точно вам говорю.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('cyberforum.ru');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  click(10,10,WebBrowser1.Handle);
end;
 
procedure TForm1.Click(x,y:longint; Handle:longint);
begin
  PostMessage(Handle,WM_LBUTTONDOWN,MK_LBUTTON,MakeLParam(x,y));
  PostMessage(Handle,WM_LBUTTONUP,MK_LBUTTON,MakeLParam(x,y));
end;
 
procedure TForm1.FormResize(Sender: TObject);
begin
  WebBrowser1.Height:=Form1.Height;
  WebBrowser1.Width:=Form1.Width;
end;
По идее, мы нажимаем на кнопку, которая отправляет браузеру сообщение о нажатии ЛКМ в левый верхний угол обозревателя. А это, на сайте сайберфорума, должно возвращать нас на главную его страницу. Ставил координаты побольше - не помогало. Умножал на 64000, как это делается в МаусЭвентах - результата нет.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2015, 17:36     PostMessage. Найти ошибку в синтаксисе или алгоритме
Посмотрите здесь:

Delphi WinAPI Работа с WinAPI (PostMessage)
Postmessage WinApi Delphi WinAPI
Delphi WinAPI Открыть MS Word 2003 или 2007 или 2010 в XP или 7
Отправка текста в чужое окно через PostMessage Delphi WinAPI
Delphi WinAPI PostMessage

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
northener
3049 / 2106 / 432
Регистрация: 15.07.2013
Сообщений: 12,177
22.02.2015, 02:33     PostMessage. Найти ошибку в синтаксисе или алгоритме #2
Цитата Сообщение от kипеш Посмотреть сообщение
По идее, мы нажимаем на кнопку, которая отправляет браузеру сообщение о нажатии ЛКМ в левый верхний угол обозревателя.
"По идее" ты отправляешь окну своей формы сообщение о нажатии ЛКМ в точке с координатами 10,10. И не более того.
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
22.02.2015, 15:29  [ТС]     PostMessage. Найти ошибку в синтаксисе или алгоритме #3
Гениально. Как я сам-то не догадался, когда код писал? Не работает, понимаете? Не. Ра. Бо. Та. Ет. Я и спрашиваю, почему может не работать.
mss
2330 / 2248 / 250
Регистрация: 24.12.2010
Сообщений: 13,733
22.02.2015, 16:00     PostMessage. Найти ошибку в синтаксисе или алгоритме #4
не имей привычку обзывать параметры и лок.переменные подпрограмм именами, совпадающими со свойствами и методами объектов

procedure TForm1.Click(x,y:longint; Handle:longint);
PostMessage(Handle... // у формы есть св-во Handle !!
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
22.02.2015, 18:40  [ТС]     PostMessage. Найти ошибку в синтаксисе или алгоритме #5
Переименование параметров процедуры не дало результатов.
planetoxod
228 / 139 / 16
Регистрация: 22.08.2014
Сообщений: 1,538
Записей в блоге: 1
23.02.2015, 07:57     PostMessage. Найти ошибку в синтаксисе или алгоритме #6
А если послать самому окну.

Добавлено через 7 минут
Нажать мышкой в определенных координатах неактивного окна

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
HWND wnd1 = FindWindow(NULL,"Form1");
POINT pt;
pt.x=50; 
pt.y=50; 
 
HWND hwnd2 = ChildWindowFromPoint(wnd1, pt);
 
SendMessage (hwnd2, WM_LBUTTONDOWN, 0, MAKELPARAM(50,50)); 
SendMessage (hwnd2, WM_LBUTTONUP, 0, MAKELPARAM(50,50));
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
23.02.2015, 10:10  [ТС]     PostMessage. Найти ошибку в синтаксисе или алгоритме #7
Кое-что проверил. С паинтбоксом всё работает вполне. А вот браузер реагировать на нажатия не хочет. Совсем. Никак.
mss
2330 / 2248 / 250
Регистрация: 24.12.2010
Сообщений: 13,733
23.02.2015, 18:31     PostMessage. Найти ошибку в синтаксисе или алгоритме #8
Цитата Сообщение от kипеш Посмотреть сообщение
Переименование параметров процедуры не дало результатов
И не должно было)
Но теперь код стало легче читать.

Цитата Сообщение от kипеш Посмотреть сообщение
браузер реагировать на нажатия не хочет
А он и не обещал.
Там может быть куча проверок, позволяющий остудить пыл начинающих кулхацкеров)
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
23.02.2015, 18:58  [ТС]     PostMessage. Найти ошибку в синтаксисе или алгоритме #9
Цитата Сообщение от mss Посмотреть сообщение
Там может быть куча проверок, позволяющий остудить пыл начинающих кулхацкеров)
Вот этот ответ мне нравится уже больше. Только как же, уважаемый, эти проверки обойти? Попробовал жирный кусок кода, который был в ссылке:
Delphi
1
2
3
4
5
6
7
PostMessage(Handle, WM_SETCURSOR, 0, MAKELPARAM(x, y));
    PostMessage(Handle, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
    PostMessage(Handle, WM_MOUSEHOVER, 0, MAKELPARAM(x, y));
    PostMessage(Handle, WM_MOUSEACTIVATE, 0, MAKELPARAM(x, y));
    PostMessage(Handle, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));
    PostMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
    PostMessage(Handle, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));
Не помогло. Может, вы сможете меня просветить?
mss
2330 / 2248 / 250
Регистрация: 24.12.2010
Сообщений: 13,733
23.02.2015, 19:06     PostMessage. Найти ошибку в синтаксисе или алгоритме #10
Да все что угодно может быть - и проверка фактического положения курсора мыши, и проверка на фокус ввода)..
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
23.02.2015, 19:24  [ТС]     PostMessage. Найти ошибку в синтаксисе или алгоритме #11
Цитата Сообщение от mss Посмотреть сообщение
Да все что угодно может быть - и проверка фактического положения курсора мыши, и проверка на фокус ввода)..
В обычном WebBrowser? Который объект формы? Я ведь не про хром какой-нибудь...
mss
2330 / 2248 / 250
Регистрация: 24.12.2010
Сообщений: 13,733
23.02.2015, 19:32     PostMessage. Найти ошибку в синтаксисе или алгоритме #12
Цитата Сообщение от kипеш Посмотреть сообщение
не закидывайте отсылками к другим темам - я там был, точно вам говорю
Ну врешь ведь)
И здесь был ? И мед-пиво пил ? И по усам текло ? И в рот не попало ?)
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
23.02.2015, 19:47  [ТС]     PostMessage. Найти ошибку в синтаксисе или алгоритме #13
Цитата Сообщение от mss Посмотреть сообщение
Ну врешь ведь)
И здесь был ? И мед-пиво пил ? И по усам текло ? И в рот не попало ?)
http://cs621416.vk.me/v621416524/11254/tbwM3tragm8.jpg
Увы, вот такая ошибка. Так что ни про мёд, ни про пиво сказать ничего не могу(
mss
2330 / 2248 / 250
Регистрация: 24.12.2010
Сообщений: 13,733
23.02.2015, 19:58     PostMessage. Найти ошибку в синтаксисе или алгоритме #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну а загуглить и в первой же полученной ссылке найти решение ?)
Не получится из тебя программист - гуглить не умеешь)
kипеш
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 19
23.02.2015, 20:06  [ТС]     PostMessage. Найти ошибку в синтаксисе или алгоритме #15
Цитата Сообщение от mss Посмотреть сообщение
Ну а загуглить и в первой же полученной ссылке найти решение ?)
Не получится из тебя программист - гуглить не умеешь)
Преклоняюсь перед вами. Не то чтобы я гуглить не умел.. кучу функций я всё-таки смог найти. Но вот недогуглил, видимо. В общем, благодарствую)
grigandal1580
1 / 1 / 0
Регистрация: 16.01.2016
Сообщений: 103
28.12.2016, 18:14     PostMessage. Найти ошибку в синтаксисе или алгоритме #16
Наверное уже поздно, но лучше поздно, чем никогда
У меня работает клик с помощью PostMessage
Но не на прямую

Чтобы кликнуть, нам нужен хендл не самого браузера, а его дочерний хендл страницы

нам понадобится рекурсивная функция

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function GetSubChild(wd: HWnd):HWnd;
Var
  Cw:HWnd;
Begin
  Result:=0;
  If WD=0 then Exit;
  Cw := FindWindowEx(Wd, 0, nil, nil);
  while (Cw <> 0) do
    begin
       Result:=cw;
       GetSubChild(Cw);
       Cw := FindWindowEx(Wd, Cw, nil, nil);
     End;
end;
и дальше делаем так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button2Click(Sender: TObject);
var
  h : hwnd;
begin
 
application.ProcessMessages;//ВАЖНАЯ СТРОКА
 
h:=webbrowser1.Handle;
h:=GetSubChild(h);
h:=GetSubChild(h);
 
PostMessage(h,WM_LBUTTONDOWN,0,(Y shl 16)+X);
PostMessage(h,WM_LBUTTONUP,0,(Y shl 16)+X);
 
application.ProcessMessages;//ВАЖНАЯ СТРОКА
end;
это позволит кликнуть по странице в координату x,y
X и Y ставятся БЕЗ учета расположения браузера на форме и положения формы на экране
Yandex
Объявления
28.12.2016, 18:14     PostMessage. Найти ошибку в синтаксисе или алгоритме
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru