![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Cобытия курсора мышки.
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-я ссылка) перевести туда курсор мышки и кликнуть по ней.