Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Cобытия курсора мышки.


Страницы:   1 2 3

hub00 ©   (2008-05-31 17:43:00) 

Вопрос.
Во время перемещения курсора мышки над текстом,ссылкой или кнопкой в окне любой программы, курсор меняет иконку (стрелка, рука, итд) происходит событие.
Как можно выполнить еще что-то кроме изменения иконки?
Другое действие, которое нужно мне.
Какая функция за это отвечает?
Спасибо.


SergeyIT   (2008-06-01 22:44:00) [21]


>  WM_SETCURSOR

Этим хуком это сообщение не перехватывается


  (2008-06-01 22:30:00) [22]

Удалено модератором


hub00   (2008-06-01 22:15:00) [23]

или так пытался      WM_SETCURSOR: Label1.Caption:='Сообщение перехвачено';
че за непонятнось.... :(


hub00   (2008-06-01 22:12:00) [24]

Собрал эту программу "Мониторинг сообщений"
http://delphiworld.narod.ru/base/messages_monitor.html
Отловил нужное сообщение мышки. Это WM_SETCURSOR. Очем и сказал DVM ©.
Действительно, windows посылает это сообщение.

Взял эту программу "Как перехватывать события, посланные другим приложениям"
http://delphiworld.narod.ru/base/catch_another_events.html
Добавил нужное сообщение и пытаюсь его поймать.
А оно не ловится. Точнее нет никаких действий. Что может быть ?

Вот листинг измененный (нужный мне)

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
 msg: PEVENTMSG;
begin
 if Code >= 0 then begin
   result := 0;
   msg := Pointer(LParam);
   with Form1 do
     case msg.message of
       WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
       WM_LBUTTONDOWN: CheckBox1.Checked := true;
       WM_LBUTTONUP: CheckBox1.Checked := false;
       WM_RBUTTONDOWN: CheckBox2.Checked := true;
       WM_RBUTTONUP: CheckBox2.Checked := false;
       WM_KEYUP: CheckBox3.Checked := false;
       WM_KEYDOWN: CheckBox3.Checked := true;
       WM_SETCURSOR: CheckBox3.Checked := true;
     end;
 end else
   result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.FormStyle := fsStayOnTop;
 CheckBox1.Enabled := false;
 CheckBox1.Caption := 'left button';
 CheckBox2.Enabled := false;
 CheckBox2.Caption := 'right button';
 CheckBox3.Enabled := false;
 CheckBox3.Caption := 'keyboard';
 CheckBox4.Enabled := false;
 CheckBox4.Caption := 'mouse';
 HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;


DVM   (2008-06-01 21:38:00) [25]


> Какое сообщение посылает виндовс когда меняется курсор мышки?

WM_SETCURSOR или никаких, если окно само меняет вид своего указателя (кстати твой случай).


SergeyIT   (2008-06-01 21:22:00) [26]


> Какое сообщение посылает виндовс когда меняется курсор мышки?

Если очень хочется поизучать сообщения от мыши - поизучайте SetWindowsHookEx и
 WH_JOURNALRECORD
 WH_JOURNALPLAYBACK
и попрограммируйте.
Очень многое узнаете.
(Только не надейтесь на быстрый результат)


hub00   (2008-06-01 21:04:00) [27]

Русские не сдаются.
Другой вариант для решения моей задачи. Еще извратнее.

Какое сообщение посылает виндовс когда меняется курсор мышки?


hub00   (2008-06-01 15:51:00) [28]

Жаль что ничего не вышло, звыняйте за потраченное ваше время. :(


{RASkov}   (2008-06-01 15:35:00) [29]

> [23] hub00 ©   (01.06.08 15:08)
> вот этот пример описывается.

Там не верно задан заголовок... нет в этом примере ничего про фокус)
Тебе зачем вообще все это нужно? Для чего хочешь заставить мышку бегать рандомно, сломя голову по форме, да еще и кликать направо и налево....
Что же такое ты делаешь?)


hub00   (2008-06-01 15:08:00) [30]

http://delphiworld.narod.ru/base/mouse_to_control_center.html
вот этот пример описывается.
Может не таймер использовать тогда?
Как тогда можно сделать чтоб к примеру программно я нажимаю клавишу Tab, выделяется ссылка после чего я думал использовать эту процедуру и перевести в центр фокуса курсор мышки.Когда он там окажется программно нажать левую кнопку (мышки). Думал постоянно таймером вызывать её к примеру каждые 3 секунды, а за эти 3 секунды переводить фокус tab`ом.


{RASkov}   (2008-06-01 14:49:00) [31]

> [20] hub00 ©   (01.06.08 14:17)

У Таймера нет свойст Left, Top, Width, Height.... Это раз. Тыж в событии таймера передаешь сам таймер в процедуру, где пытаешься из него сделать несуществующий контрол...
Во вторых - это тебе кажется, что "по кнопке" мышь переходит в центр активного контрола.... ну да кнопка-то становится активной :)
Процедура в [18] да, центрирует мышь по центру переданного в нее "контрола", а ты туда что передаешь?
И узнай обязательно, что такое Sender)


Leonid Troyanovsky   (2008-06-01 14:48:00) [32]


> hub00 ©   (01.06.08 14:17) [20]

>  with TControl(Sender) do
>  begin
>    Point.X := Left + (Width  div 2);
>    Point.Y := Top +  (Height div 2);
>    Point := Parent.ClientToScreen(Point);

У таймера не может быть парента, да и, во-ще, он не контрол.

--
Regards, LVT.


hub00   (2008-06-01 14:17:00) [33]

Вот. Если я вызываю процедуру через нажатие кнопки, то мышка переходит в область фокуса, но если через таймер. то ошибка. "Project1.exe of adress 00003E8. Process stopped. Use step or run to continue."

procedure MoveMouseOverControl(Sender: TObject);
var
 Point: TPoint;
begin
 with TControl(Sender) do
 begin
   Point.X := Left + (Width  div 2);
   Point.Y := Top +  (Height div 2);
   Point := Parent.ClientToScreen(Point);
   SetCursorPos(Point.X, Point.Y);
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
MoveMouseOverControl(Sender);
end;


{RASkov}   (2008-06-01 12:04:00) [34]

> [18] hub00 ©   (01.06.08 11:16)
> Как автоматически помещать курсор мышки в центр контрола
> получившего фокус

Код в [18] - это не то что ты думаешь.... там даже ни одной инструкции нет связанной с фокусом ввода...
Ошибка-то какая? AV небось)...
Кстати, почему не показываешь как вызываешь данную процедуру?
ЗЫ: Копайся далее.... Неблагородными делами занимаешься) И, главное, не хочешь понять, что занимаешься не тем...


hub00   (2008-06-01 11:16:00) [35]

Копался в сети нашел этот это

Как автоматически помещать курсор мышки в центр контрола получившего фокус
procedure MoveMouseOverControl(Sender: TObject);
var
 Point: TPoint;
begin
 with TControl(Sender) do
 begin
   Point.X := Left + (Width  div 2);
   Point.Y := Top +  (Height div 2);
   Point := Parent.ClientToScreen(Point);
   SetCursorPos(Point.X, Point.Y);
 end;
end;

Хотел запускать через таймер, вылетает ошибка. В чем может быть проблема?


hub00   (2008-06-01 09:37:00) [36]

Да, Германн представь, координаты курсора мышки на "Рабочем столе".
Фантастика.


Германн   (2008-06-01 02:18:00) [37]


> hub00 ©   (01.06.08 01:47) [15]
>
> А если я буду программно менять её координаты, она не будет
> произвольно двигаться?
>

Чьи координаты? Мышки? На твоём столе?
Но уж точно! Программно мышку нельзя передвинуь!


hub00   (2008-06-01 01:47:00) [38]

А если я буду программно менять её координаты, она не будет произвольно двигаться?


Германн   (2008-06-01 01:36:00) [39]


> hub00 ©   (01.06.08 01:19) [12]
>
> Ребята, вы не так поняли меня.
> Мышкой водить я не буду. Она сама рандомно будет гулять
> в окне.
> Гулять до тех пор, пока не проскочит над какой-то ссылкой.
>
> Вот в тот момент когда она будет над ней (ссылкой), программно
> сделать нажатие кнопки и перейти.
>

А как тебя понять, Саид? Сама мышка никогда не блуждает.


hub00   (2008-06-01 01:25:00) [40]

Я думал иначе сделать, сначало Tab`ом выделять (подсвечивать) ссылки (рандомно) к примеру 10 нажатий и оказался б я на 10-й ссылке.  
Потом как-то узнать то место где остановился Tab (10-я ссылка) перевести туда курсор мышки и кликнуть по ней.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо