Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.04.24;
Скачать: CL | DM;

Вниз

подмена координат клика курсора для определенного окна   Найти похожие ветки 

 
antonn ©   (2009-04-04 22:46) [0]

Начал копать, но заранее спрошу - реально ли сделать, желательно более скромными средствами ОС? :) типа без инжекта и прочего, хуком каким нить.
Более конкретно - в окно тычут курсором, хочу чтобы в окно приходили координаты нете, что по OnMouseDown(), а мои (смещенные в сторону). Насколько реально это или не стоит заморачиваться?


 
Eraser ©   (2009-04-04 22:52) [1]

> [0] antonn ©   (04.04.09 22:46)


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

как раз хуком и можно.


 
antonn ©   (2009-04-04 22:58) [2]

я вот пока смотрю на пример Розе по подмене таблицы импорта, но целевое приложение это может не пережить, посмотрю что попроще :)


 
Сергей М. ©   (2009-04-04 23:06) [3]


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


Оно-то как раз не помрет, ежели оно "честное" и пакостей не делает.
Ему какая нафих разница, где актуально находится т.входа в некую API-подпрограмму ? А никакой ! Лишь бы делала эта подпрограмма свое ожидаемое дело )
А вот "честность твоего как раз под вопросом)


 
Eraser ©   (2009-04-05 00:50) [4]

> [2] antonn ©   (04.04.09 22:58)

зачем таблицы импорта и т.п. достаточно перехватывать нужные сообщения хуком и модифицировать их нужным образом.


 
antonn ©   (2009-04-05 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 ©   (2009-04-05 01:07) [6]


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

в смысле выводятся те, что передаются обработчиком, и "честные", от того, что я pt.x поменял толку нету, мож не там меняю.. :)


 
Германн ©   (2009-04-05 01:32) [7]


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

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


 
antonn ©   (2009-04-05 01:37) [8]


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

окно ресайзю, масштабирование координат тычков курсора нужно (под новый размер окна)


 
Германн ©   (2009-04-05 01:45) [9]


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

Эээ.
Сначала клик, потом ресайз, потом переопределение координат? Так что-ли? Странная последовательность, не кажется?
Или я не правильно понял?


 
Германн ©   (2009-04-05 01:59) [10]

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


 
antonn ©   (2009-04-05 02:00) [11]

не, окно один раз меняет свои размеры, контролов в окне нет.
а вот последующие клики в окно нужно делать в предыдущем масштабе, потому хочу научиться хотя бы координаты подменять, для одного окна :)


 
antonn ©   (2009-04-05 02:02) [12]


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

потому что я ждал ответа "да/нет", а как оказалось че то не работает смена pt.x :)
завтра еще поковыряю примеры, если не получится - и там вопрос будет, но другой :)


 
Германн ©   (2009-04-05 02:10) [13]


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

Но ты ведь сам меняешь его размеры! Или нет?


 
Eraser ©   (2009-04-05 02:10) [14]

> [11] antonn ©   (05.04.09 02:00)

кстати раз уж ты тут упомянул масштабы. зачем вообще нужено [0]?


 
antonn ©   (2009-04-05 02:16) [15]

игрушка, не поддерживает нестандартные разрешения (а есть вполне быстрые ноуты с 1024*600 разрешением :) ). Я меняю окну игры размер (изображение растягивается на всю форму), но клики идут по локальным координатам формы, хочу сделать так, чтобы клик шел по нужным элементам в игре, потому и ищу способ подменять координаты курсора с соблюдением масштаба :) т.е. игра как бы не знает, что буфер вывода изменил свои размеры.


 
Eraser ©   (2009-04-05 02:43) [16]

возможно стоит менять не размер окна, а его параметры масштабирования? http://frolov-lib.ru/books/bsp/v14/ch2_2.htm


 
DVM ©   (2009-04-05 15:00) [17]


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

Если она DirectX, то фокус с мышью может и не удастся.


 
antonn ©   (2009-04-05 22:28) [18]

да, с DX, одна из dll импортирует Set/GetCursorPos, потому надеялся, что может через него получится провернуть (подменить функцию). Приложение оконное.


 
antonn ©   (2009-04-05 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 ©   (2009-04-06 17:27) [20]

Up, слегка другой вопрос, уже дело принципа :)
Кто доставляет TControl сообщение WM_MOUSEMOVE?
ставлю хук на WH_GETMESSAGE, для нужного окна, фильтрую в нем WM_MOUSEMOVE и в TMsg().pt получаю экранные координаты. Их изменение работает лишь в одном случае - когда я таскаю окно за заголовок (если TMsg().pt.x:=10 то по горизонтали окно не таскается). При этом в WMMouseMove у TControl приходит структура TWMMouseMove с локальными координатами (не искаженными), кто их преобразует и кто формирует эту структуру (или как ее отловить то?)? Сам не могу найти откуда хвост :)


 
antonn ©   (2009-07-15 14:51) [21]

Up? :)


 
Игорь Шевченко ©   (2009-07-15 17:48) [22]


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


TControl-у сообщение доставляет родительское окно (TWinControl). TWinControl-у соответственно, система - грубо говоря, через WindowFromPoint, преобразование экранных координат в клиентские и помещение сообщения в очередь потока, которому принадлежит окно


 
antonn ©   (2009-07-15 20:41) [23]

обидно, значит система не передает в дельфийное окно координаты сообщениями (точнее вызывается GetCursorPos())? и хуком ее не "переубедить"?


 
Игорь Шевченко ©   (2009-07-16 01:10) [24]

antonn ©   (15.07.09 20:41) [23]


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

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

Вообще странно, WH_GETMESSAGE вызывается непосредственно перед доставкой сообщения окну и координаты там должны быть клиентские.



Страницы: 1 вся ветка

Текущий архив: 2011.04.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
15-1293095836
Павел Калугин
2010-12-23 12:17
2011.04.24
Встретим новый год в Нижнем Новгороде?


15-1292834915
12
2010-12-20 11:48
2011.04.24
Как существует Антиматерия or Где хранить всепрожигающую киcлоту?


15-1294513990
Dimka Maslov
2011-01-08 22:13
2011.04.24
Ошибка в Delphi 2009


15-1294985178
Медвежонок ХМЛ
2011-01-14 09:06
2011.04.24
УЭК


1-1252963791
Ruzzz
2009-09-15 01:29
2011.04.24
Результат в регистр AX, как работает компилятор?