Конференция "WinAPI" » подмена координат клика курсора для определенного окна [D7, WinXP]
 
  • antonn © (04.04.09 22:46) [0]
    Начал копать, но заранее спрошу - реально ли сделать, желательно более скромными средствами ОС? :) типа без инжекта и прочего, хуком каким нить.
    Более конкретно - в окно тычут курсором, хочу чтобы в окно приходили координаты нете, что по OnMouseDown(), а мои (смещенные в сторону). Насколько реально это или не стоит заморачиваться?
  • Eraser © (04.04.09 22:52) [1]
    > [0] antonn ©   (04.04.09 22:46)


    > типа без инжекта и прочего, хуком каким нить.

    как раз хуком и можно.
  • antonn © (04.04.09 22:58) [2]
    я вот пока смотрю на пример Розе по подмене таблицы импорта, но целевое приложение это может не пережить, посмотрю что попроще :)
  • Сергей М. © (04.04.09 23:06) [3]

    > целевое приложение это может не пережить


    Оно-то как раз не помрет, ежели оно "честное" и пакостей не делает.
    Ему какая нафих разница, где актуально находится т.входа в некую API-подпрограмму ? А никакой ! Лишь бы делала эта подпрограмма свое ожидаемое дело )
    А вот "честность твоего как раз под вопросом)
  • Eraser © (05.04.09 00:50) [4]
    > [2] antonn ©   (04.04.09 22:58)

    зачем таблицы импорта и т.п. достаточно перехватывать нужные сообщения хуком и модифицировать их нужным образом.
  • antonn © (05.04.09 01:03) [5]

    > А вот "честность твоего как раз под вопросом)

    достаточно честен, по крайней мере ничего не ломаю :)


    > Eraser ©   (05.04.09 00:50) [4]

    я тож так думал, создал проект в дельфи пустой, по MouseMove в лабел вывожу те координаты, что передаются в обработчике - они не меняются, может где внутрях просто вызывается GetCursorPos() и форма плевала на то, что ей приходило? :)

    TID:=GetWindowThreadProcessId(TargetHandle, nil);
    Hook := SetWindowsHookEx(WH_MOUSE, @SysMsgProc, HInstance,TID );

    function SysMsgProc(code : integer; wParam : longint; lParam : longint) : longint; stdcall;
    var MHS:TMOUSEHOOKSTRUCT;
    begin
     if(code<0) then begin
       Result:= CallNextHookEx(Hook, Code, wParam, lParam);
       exit;
     end;
     MHS:=PMOUSEHOOKSTRUCT(lParam)^;

     if ((wParam=WM_RBUTTONDOWN) or (wParam=WM_RBUTTONUP) or (wParam=WM_MOUSEMOVE)) then begin
      MHS.pt.X:=25;
      // а если тут незахочу дальше перекинуть сообщение - то до формы как и ожидалось ничего не дойдет
     end;

     Result:= CallNextHookEx(Hook, Code, wParam, lParam);
    end;

  • antonn © (05.04.09 01:07) [6]

    > что передаются в обработчике - они не меняются

    в смысле выводятся те, что передаются обработчиком, и "честные", от того, что я pt.x поменял толку нету, мож не там меняю.. :)
  • Германн © (05.04.09 01:32) [7]

    > antonn ©   (05.04.09 01:03) [5]
    >
    >
    > > А вот "честность твоего как раз под вопросом)
    >
    > достаточно честен, по крайней мере ничего не ломаю :)
    >

    Я, лично, не сомневаюсь.
    Но зачем?
  • antonn © (05.04.09 01:37) [8]

    > Я, лично, не сомневаюсь.
    > Но зачем?

    окно ресайзю, масштабирование координат тычков курсора нужно (под новый размер окна)
  • Германн © (05.04.09 01:45) [9]

    > antonn ©   (05.04.09 01:37) [8]
    >
    >
    > > Я, лично, не сомневаюсь.
    > > Но зачем?
    >
    > окно ресайзю, масштабирование координат тычков курсора нужно
    > (под новый размер окна)
    >

    Эээ.
    Сначала клик, потом ресайз, потом переопределение координат? Так что-ли? Странная последовательность, не кажется?
    Или я не правильно понял?
  • Германн © (05.04.09 01:59) [10]
    Хм 2.
    А почему этого вопроса нет на форуме Исходников?
  • antonn © (05.04.09 02:00) [11]
    не, окно один раз меняет свои размеры, контролов в окне нет.
    а вот последующие клики в окно нужно делать в предыдущем масштабе, потому хочу научиться хотя бы координаты подменять, для одного окна :)
  • antonn © (05.04.09 02:02) [12]

    > А почему этого вопроса нет на форуме Исходников?

    потому что я ждал ответа "да/нет", а как оказалось че то не работает смена pt.x :)
    завтра еще поковыряю примеры, если не получится - и там вопрос будет, но другой :)
  • Германн © (05.04.09 02:10) [13]

    > antonn ©   (05.04.09 02:00) [11]
    >
    > не, окно один раз меняет свои размеры

    Но ты ведь сам меняешь его размеры! Или нет?
  • Eraser © (05.04.09 02:10) [14]
    > [11] antonn ©   (05.04.09 02:00)

    кстати раз уж ты тут упомянул масштабы. зачем вообще нужено [0]?
  • antonn © (05.04.09 02:16) [15]
    игрушка, не поддерживает нестандартные разрешения (а есть вполне быстрые ноуты с 1024*600 разрешением :) ). Я меняю окну игры размер (изображение растягивается на всю форму), но клики идут по локальным координатам формы, хочу сделать так, чтобы клик шел по нужным элементам в игре, потому и ищу способ подменять координаты курсора с соблюдением масштаба :) т.е. игра как бы не знает, что буфер вывода изменил свои размеры.
  • Eraser © (05.04.09 02:43) [16]
    возможно стоит менять не размер окна, а его параметры масштабирования? http://frolov-lib.ru/books/bsp/v14/ch2_2.htm
  • DVM © (05.04.09 15:00) [17]

    > antonn ©   (05.04.09 02:16) [15]
    >
    > игрушка, не поддерживает нестандартные разрешения

    Если она DirectX, то фокус с мышью может и не удастся.
  • antonn © (05.04.09 22:28) [18]
    да, с DX, одна из dll импортирует Set/GetCursorPos, потому надеялся, что может через него получится провернуть (подменить функцию). Приложение оконное.
  • antonn © (05.04.09 23:49) [19]
    в общем наверное я зря пыхался и ставил хук на WH_MOUSE, в TWinControl в WMSetCursor() вызывается GetCursorPos() :(
    там же обнаружил интересную конструкцию :)
               if Cursor = crDefault then
               begin
                 GetCursorPos(P);
                 //тра-ля-ля
               end;
               if Cursor <> crDefault then
               begin
                 Windows.SetCursor(Screen.Cursors[Cursor]);
                 Result := 1;
                 Exit;
               end;

  • antonn © (06.04.09 17:27) [20]
    Up, слегка другой вопрос, уже дело принципа :)
    Кто доставляет TControl сообщение WM_MOUSEMOVE?
    ставлю хук на WH_GETMESSAGE, для нужного окна, фильтрую в нем WM_MOUSEMOVE и в TMsg().pt получаю экранные координаты. Их изменение работает лишь в одном случае - когда я таскаю окно за заголовок (если TMsg().pt.x:=10 то по горизонтали окно не таскается). При этом в WMMouseMove у TControl приходит структура TWMMouseMove с локальными координатами (не искаженными), кто их преобразует и кто формирует эту структуру (или как ее отловить то?)? Сам не могу найти откуда хвост :)
  • antonn © (15.07.09 14:51) [21]
    Up? :)
  • Игорь Шевченко © (15.07.09 17:48) [22]

    > Кто доставляет TControl сообщение WM_MOUSEMOVE?


    TControl-у сообщение доставляет родительское окно (TWinControl). TWinControl-у соответственно, система - грубо говоря, через WindowFromPoint, преобразование экранных координат в клиентские и помещение сообщения в очередь потока, которому принадлежит окно
  • antonn © (15.07.09 20:41) [23]
    обидно, значит система не передает в дельфийное окно координаты сообщениями (точнее вызывается GetCursorPos())? и хуком ее не "переубедить"?
  • Игорь Шевченко © (16.07.09 01:10) [24]
    antonn ©   (15.07.09 20:41) [23]


    > значит система не передает в дельфийное окно координаты
    > сообщениями

    ClientToScreen - и у тебя экранные координаты сообщения.

    Вообще странно, WH_GETMESSAGE вызывается непосредственно перед доставкой сообщения окну и координаты там должны быть клиентские.
 
Конференция "WinAPI" » подмена координат клика курсора для определенного окна [D7, WinXP]
Есть новые Нет новых   [134434   +26][b:0][p:0.002]