-
Вот. Если я вызываю процедуру через нажатие кнопки, то мышка переходит в область фокуса, но если через таймер. то ошибка. "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; -
> 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. -
{RASkov} © (01.06.08 14:49) [22]> [20] hub00 © (01.06.08 14:17)
У Таймера нет свойст Left, Top, Width, Height.... Это раз. Тыж в событии таймера передаешь сам таймер в процедуру, где пытаешься из него сделать несуществующий контрол...
Во вторых - это тебе кажется, что "по кнопке" мышь переходит в центр активного контрола.... ну да кнопка-то становится активной :)
Процедура в [18] да, центрирует мышь по центру переданного в нее "контрола", а ты туда что передаешь?
И узнай обязательно, что такое Sender) -
http://delphiworld.narod.ru/base/mouse_to_control_center.html
вот этот пример описывается.
Может не таймер использовать тогда?
Как тогда можно сделать чтоб к примеру программно я нажимаю клавишу Tab, выделяется ссылка после чего я думал использовать эту процедуру и перевести в центр фокуса курсор мышки.Когда он там окажется программно нажать левую кнопку (мышки). Думал постоянно таймером вызывать её к примеру каждые 3 секунды, а за эти 3 секунды переводить фокус tab`ом. -
{RASkov} © (01.06.08 15:35) [24]> [23] hub00 © (01.06.08 15:08)
> вот этот пример описывается.
Там не верно задан заголовок... нет в этом примере ничего про фокус)
Тебе зачем вообще все это нужно? Для чего хочешь заставить мышку бегать рандомно, сломя голову по форме, да еще и кликать направо и налево....
Что же такое ты делаешь?) -
Жаль что ничего не вышло, звыняйте за потраченное ваше время. :(
-
Русские не сдаются.
Другой вариант для решения моей задачи. Еще извратнее.
Какое сообщение посылает виндовс когда меняется курсор мышки? -
SergeyIT (01.06.08 21:22) [27]
> Какое сообщение посылает виндовс когда меняется курсор мышки?
Если очень хочется поизучать сообщения от мыши - поизучайте SetWindowsHookEx и
WH_JOURNALRECORD
WH_JOURNALPLAYBACK
и попрограммируйте.
Очень многое узнаете.
(Только не надейтесь на быстрый результат) -
> Какое сообщение посылает виндовс когда меняется курсор мышки?
WM_SETCURSOR или никаких, если окно само меняет вид своего указателя (кстати твой случай). -
Собрал эту программу "Мониторинг сообщений"
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; -
или так пытался WM_SETCURSOR: Label1.Caption:='Сообщение перехвачено';
че за непонятнось.... :( -
имя(01.06.08 22:30) [31]Удалено модератором -
SergeyIT (01.06.08 22:44) [32]
> WM_SETCURSOR
Этим хуком это сообщение не перехватывается -
Ну не работает оно с табом и все.
Я что против. -
SergeyIT, а каким?
-
имя(01.06.08 22:56) [35]Удалено модератором -
SergeyIT (01.06.08 23:08) [36]
> а каким?
Ищите... -
CURSOR, ты прав для этого. Поделись пожалуйста.
(И причем тут кривые руки как умею так и делаю.)
SergeyIT, ок. -
SergeyIT (01.06.08 23:35) [38]Для проверки хуков у MS была программка (hooktest как-то) - в ней можно было все попробовать.
Я подобное делал через playback (для выставки - демонстрация работы связки нескольких программ под Вин3.11, давно было)
Вообще-то решение зависит от условий задачи, которые нам неизвестны.
Что за программа, ссылки? Если нажать на ссылку ведь может появиться новое окно, программа/диалог и что тогда делать? -
имя(01.06.08 23:39) [39]Удалено модератором