Конференция "WinAPI" » Cобытия курсора мышки.
 
  • hub00 © (01.06.08 14:17) [20]
    Вот. Если я вызываю процедуру через нажатие кнопки, то мышка переходит в область фокуса, но если через таймер. то ошибка. "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;
  • Leonid Troyanovsky © (01.06.08 14:48) [21]

    > 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)
  • hub00 © (01.06.08 15:08) [23]
    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)
    > вот этот пример описывается.

    Там не верно задан заголовок... нет в этом примере ничего про фокус)
    Тебе зачем вообще все это нужно? Для чего хочешь заставить мышку бегать рандомно, сломя голову по форме, да еще и кликать направо и налево....
    Что же такое ты делаешь?)
  • hub00 © (01.06.08 15:51) [25]
    Жаль что ничего не вышло, звыняйте за потраченное ваше время. :(
  • hub00 © (01.06.08 21:04) [26]
    Русские не сдаются.
    Другой вариант для решения моей задачи. Еще извратнее.

    Какое сообщение посылает виндовс когда меняется курсор мышки?
  • SergeyIT (01.06.08 21:22) [27]

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

    Если очень хочется поизучать сообщения от мыши - поизучайте SetWindowsHookEx и
     WH_JOURNALRECORD
     WH_JOURNALPLAYBACK
    и попрограммируйте.
    Очень многое узнаете.
    (Только не надейтесь на быстрый результат)
  • DVM © (01.06.08 21:38) [28]

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

    WM_SETCURSOR или никаких, если окно само меняет вид своего указателя (кстати твой случай).
  • hub00 © (01.06.08 22:12) [29]
    Собрал эту программу "Мониторинг сообщений"
    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;
  • hub00 © (01.06.08 22:15) [30]
    или так пытался      WM_SETCURSOR: Label1.Caption:='Сообщение перехвачено';
    че за непонятнось.... :(
  • имя (01.06.08 22:30) [31]
    Удалено модератором
  • SergeyIT (01.06.08 22:44) [32]

    >  WM_SETCURSOR

    Этим хуком это сообщение не перехватывается
  • hub00 © (01.06.08 22:47) [33]
    Ну не работает оно с табом и все.
    Я что против.
  • hub00 © (01.06.08 22:48) [34]
    SergeyIT, а каким?
  • имя (01.06.08 22:56) [35]
    Удалено модератором
  • SergeyIT (01.06.08 23:08) [36]

    > а каким?

    Ищите...
  • hub00 © (01.06.08 23:15) [37]
    CURSOR, ты прав для этого. Поделись пожалуйста.
    (И причем тут кривые руки как умею так и делаю.)
    SergeyIT, ок.
  • SergeyIT (01.06.08 23:35) [38]
    Для проверки хуков у MS была программка (hooktest как-то) - в ней можно было все попробовать.
    Я подобное делал через playback (для выставки - демонстрация работы связки нескольких программ под Вин3.11, давно было)
    Вообще-то решение зависит от условий задачи, которые нам неизвестны.
    Что за программа, ссылки? Если нажать на ссылку ведь может появиться новое окно, программа/диалог и что тогда делать?
  • имя (01.06.08 23:39) [39]
    Удалено модератором
 
Конференция "WinAPI" » Cобытия курсора мышки.
Есть новые Нет новых   [134432   +19][b:0][p:0.001]