Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Программно установить курсор мыши в браузере IE


Автор: Vladimir_K 17.1.2008, 21:18
Подскажите, пожалста, как программно установить курсор мыши в окне браузера (IE или каком другом) в определенную точку, и кликнуть в этом окне в нужном месте.

Автор: Prof_2000 18.1.2008, 18:08
Вот код, который эмулирует нажатие клавиши мышки. Разумеется, окно IE или другого браузера должно быть открыто и находиться поверх остальных.

Код

uses
  ... Controls;
  ...
  var P: tPoint;
begin
  P.X:= 20;
  P.Y:= 20;
  Mouse.CursorPos:= P;
  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  ...

Автор: Vladimir_K 18.1.2008, 22:17
Так, спасибо, это понятно. smile 

А как сделать, чтобы при движении мышкой по окну IE в окне Message, или лучше в хинте рядом с курсором мышки отображались текущие координаты? Ну, чтобы узнать координаты цели, а потом уже программно по этим координатам кликать.
Обрабатываю MouseMove, но у меня это событие привязано к окну формы, а как обрабатывать это событие, если моя прога свернута, а курсор двигается по окну IE?

Автор: CompWorm 18.1.2008, 23:49
сделай свой хинт smile  координаты формы, куда выводится текст, равны координатам курсора...

Автор: Ofer 19.1.2008, 01:53
А GetCursorPos не подходит? ;)

Автор: Vladimir_K 19.1.2008, 15:29
Цитата(CompWorm @ 18.1.2008,  22:49)
сделай свой хинт smile  координаты формы, куда выводится текст, равны координатам курсора...

Не понял. Хинт должен отображаться в окне IE. Вот это как сделать? 
В окне своей проги я хинт вывожу без проблем.
user posted image

Автор: Prof_2000 19.1.2008, 16:01
CompWorm имел ввиду, что следует создать свою форму с BorderStyle=bsNone.

Я вот накидал примерчик, повесил 2 TLabel, установил форме BorderStyle=bsNone и FormStyle=fsStayOnTop. На обработчик OnClick для lblX повесил:
Код

procedure TForm1.lblXClick(Sender: TObject);
var a : TPoint;
begin
  repeat
    GetCursorPos(a);
    Left := a.X + 10;
    Top := a.Y + 5;
    lblX.Caption := IntToStr(a.X);
    lblY.Caption := IntToStr(a.Y);
    Application.ProcessMessages;
  until false;
end;


Автор: Vladimir_K 19.1.2008, 17:03
Для чего я все это делаю: хочу сделать что-то типа проги, которая запоминает движения мыши, а потом их воспроизводит без моего участия, такую, например, как E-Motion Direct 2.0. Только эта прога не учитывает, что соединение с инетом может прерваться, а моя будет соединяться заново.

Попробовал использовать WebBrowser, страница грузится, отображается - все путем.
Но у компонента WebBrowser нет события MouseMove, как отслеживать перемещения мыши, и выводить координаты курсора в хинте рядом с курсором?

Автор: CompWorm 19.1.2008, 17:08
да, я это и имел в виду.
не важно чему хинт принадлежит конкретно окну браузера или вцелом... важно чтоб он вылез под курсором. и тут пример Prof_2000 очень к стати...


Vladimir_K, судя по скриншоту (координаты 150 и 125), ты хочешь в хинт писать координаты именно относительно окна браузера, а не глобальные координаты курсора... это так?
тогда такие значения можно высчитат как глобальная координата мыши - координата окна браузера. 
данные о положении любого окна можно узнать через

Код

BOOL GetWindowRect
(
HWND hWnd,        // дескриптор окна
LPRECT lpRect        // адрес структуры для координат окна
);

Автор: CompWorm 19.1.2008, 17:28
я так долго писал свое сообщение, что ты уже успел раньше меня что-то дописать))))

ты сделай проще прогу:
жмем энтор на клаве и с этого момента пиши координаты мыши (GetCursorPos) в файл... 
далее открываем файл и меняем координаты мыши по тому что в файле (SetCursorPos)...

Автор: Vladimir_K 19.1.2008, 17:42
Да, так и сделаю.

Но вот с этим как быть: 
Попробовал использовать компонент WebBrowser, страница грузится, отображается - все путем.
Но у компонента WebBrowser нет события MouseMove, как отслеживать перемещения мыши, и выводить координаты курсора в хинте рядом с курсором? 

Это должно быть проще - все в пределах моей проги. А потом уже перейду к вопросу взаимодействия с другими приложениями.

Автор: Vladimir_K 19.1.2008, 18:32
Цитата(Prof_2000 @ 19.1.2008,  15:01)
Я вот накидал примерчик, повесил 2 TLabel, установил форме BorderStyle=bsNone и FormStyle=fsStayOnTop. На обработчик OnClick для lblX повесил...

Да, вот это именно то, что я имел в виду! smile 
Показываются глобальные координаты.
Программку только проблематично закрыть. smile 

А как же быть с MouseMove в WebBrowser?

Добавлено через 2 минуты и 56 секунд
Цитата(CompWorm @ 19.1.2008,  16:08)
Vladimir_K, судя по скриншоту (координаты 150 и 125), ты хочешь в хинт писать координаты именно относительно окна браузера, а не глобальные координаты курсора... это так?
тогда такие значения можно высчитат как глобальная координата мыши - координата окна браузера. 
данные о положении любого окна можно узнать через

Код

BOOL GetWindowRect
(
HWND hWnd,        // дескриптор окна
LPRECT lpRect        // адрес структуры для координат окна
);

Это уже посложнее будет... Потом этим вопросом займусь.

Автор: Vladimir_K 19.1.2008, 20:23
Сделал так:
Код

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var P: tPoint;
begin
 repeat
  GetCursorPos(P);
  Label1.Caption:= 'X = ' + IntToStr(P.X);
  Label2.Caption:= 'Y = ' + IntToStr(P.Y);
  Application.ProcessMessages;
 until false;
end;

Теперь у меня отображаются глобальные координаты, а как вычислить координаты именно относительно окна моей проги (формы)? 
Что-то с этим вопросом я застопорился.

Автор: CompWorm 20.1.2008, 16:26
Цитата

Теперь у меня отображаются глобальные координаты, а как вычислить координаты именно относительно окна моей проги (формы)? 
Что-то с этим вопросом я застопорился. 


Код

...
  GetCursorPos(P);
  Label1.Caption:= 'X = ' + IntToStr(P.X - Form1.Left);
  Label2.Caption:= 'Y = ' + IntToStr(P.Y - Form1.Top);
...


уж до этого мог бы догадаться и сам smile 

Автор: Vladimir_K 20.1.2008, 17:54
Спасибо! +

Автор: Ofer 20.1.2008, 21:23
Цитата(CompWorm @  20.1.2008,  16:26 Найти цитируемый пост)
...  GetCursorPos(P);  Label1.Caption:= 'X = ' + IntToStr(P.X - Form1.Left);  Label2.Caption:= 'Y = ' + IntToStr(P.Y - Form1.Top);...


Ребята, а не про это ли писал в самом начале ))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)