-
Начал копать, но заранее спрошу - реально ли сделать, желательно более скромными средствами ОС? :) типа без инжекта и прочего, хуком каким нить. Более конкретно - в окно тычут курсором, хочу чтобы в окно приходили координаты нете, что по OnMouseDown(), а мои (смещенные в сторону). Насколько реально это или не стоит заморачиваться?
-
> [0] antonn © (04.04.09 22:46)
> типа без инжекта и прочего, хуком каким нить.
как раз хуком и можно.
-
я вот пока смотрю на пример Розе по подмене таблицы импорта, но целевое приложение это может не пережить, посмотрю что попроще :)
-
> целевое приложение это может не пережить
Оно-то как раз не помрет, ежели оно "честное" и пакостей не делает. Ему какая нафих разница, где актуально находится т.входа в некую API-подпрограмму ? А никакой ! Лишь бы делала эта подпрограмма свое ожидаемое дело ) А вот "честность твоего как раз под вопросом)
-
> [2] antonn © (04.04.09 22:58)
зачем таблицы импорта и т.п. достаточно перехватывать нужные сообщения хуком и модифицировать их нужным образом.
-
> А вот "честность твоего как раз под вопросом)
достаточно честен, по крайней мере ничего не ломаю :) > 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;
-
> что передаются в обработчике - они не меняются
в смысле выводятся те, что передаются обработчиком, и "честные", от того, что я pt.x поменял толку нету, мож не там меняю.. :)
-
> antonn © (05.04.09 01:03) [5] > > > > А вот "честность твоего как раз под вопросом) > > достаточно честен, по крайней мере ничего не ломаю :) >
Я, лично, не сомневаюсь. Но зачем?
-
> Я, лично, не сомневаюсь. > Но зачем?
окно ресайзю, масштабирование координат тычков курсора нужно (под новый размер окна)
-
> antonn © (05.04.09 01:37) [8] > > > > Я, лично, не сомневаюсь. > > Но зачем? > > окно ресайзю, масштабирование координат тычков курсора нужно > (под новый размер окна) >
Эээ. Сначала клик, потом ресайз, потом переопределение координат? Так что-ли? Странная последовательность, не кажется? Или я не правильно понял?
-
Хм 2. А почему этого вопроса нет на форуме Исходников?
-
не, окно один раз меняет свои размеры, контролов в окне нет. а вот последующие клики в окно нужно делать в предыдущем масштабе, потому хочу научиться хотя бы координаты подменять, для одного окна :)
-
> А почему этого вопроса нет на форуме Исходников?
потому что я ждал ответа "да/нет", а как оказалось че то не работает смена pt.x :) завтра еще поковыряю примеры, если не получится - и там вопрос будет, но другой :)
-
> antonn © (05.04.09 02:00) [11] > > не, окно один раз меняет свои размеры
Но ты ведь сам меняешь его размеры! Или нет?
-
> [11] antonn © (05.04.09 02:00)
кстати раз уж ты тут упомянул масштабы. зачем вообще нужено [0]?
-
игрушка, не поддерживает нестандартные разрешения (а есть вполне быстрые ноуты с 1024*600 разрешением :) ). Я меняю окну игры размер (изображение растягивается на всю форму), но клики идут по локальным координатам формы, хочу сделать так, чтобы клик шел по нужным элементам в игре, потому и ищу способ подменять координаты курсора с соблюдением масштаба :) т.е. игра как бы не знает, что буфер вывода изменил свои размеры.
-
-
> antonn © (05.04.09 02:16) [15] > > игрушка, не поддерживает нестандартные разрешения
Если она DirectX, то фокус с мышью может и не удастся.
-
да, с DX, одна из dll импортирует Set/GetCursorPos, потому надеялся, что может через него получится провернуть (подменить функцию). Приложение оконное.
-
в общем наверное я зря пыхался и ставил хук на 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;
-
Up, слегка другой вопрос, уже дело принципа :) Кто доставляет TControl сообщение WM_MOUSEMOVE? ставлю хук на WH_GETMESSAGE, для нужного окна, фильтрую в нем WM_MOUSEMOVE и в TMsg().pt получаю экранные координаты. Их изменение работает лишь в одном случае - когда я таскаю окно за заголовок (если TMsg().pt.x:=10 то по горизонтали окно не таскается). При этом в WMMouseMove у TControl приходит структура TWMMouseMove с локальными координатами (не искаженными), кто их преобразует и кто формирует эту структуру (или как ее отловить то?)? Сам не могу найти откуда хвост :)
-
Up? :)
-
> Кто доставляет TControl сообщение WM_MOUSEMOVE?
TControl-у сообщение доставляет родительское окно (TWinControl). TWinControl-у соответственно, система - грубо говоря, через WindowFromPoint, преобразование экранных координат в клиентские и помещение сообщения в очередь потока, которому принадлежит окно
-
обидно, значит система не передает в дельфийное окно координаты сообщениями (точнее вызывается GetCursorPos())? и хуком ее не "переубедить"?
-
antonn © (15.07.09 20:41) [23]
> значит система не передает в дельфийное окно координаты > сообщениями
ClientToScreen - и у тебя экранные координаты сообщения.
Вообще странно, WH_GETMESSAGE вызывается непосредственно перед доставкой сообщения окну и координаты там должны быть клиентские.
|