![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
подмена координат клика курсора для определенного окна [D7, WinXP]
antonn © (2009-04-04 22:46:00)Начал копать, но заранее спрошу - реально ли сделать, желательно более скромными средствами ОС? :) типа без инжекта и прочего, хуком каким нить.
Более конкретно - в окно тычут курсором, хочу чтобы в окно приходили координаты нете, что по OnMouseDown(), а мои (смещенные в сторону). Насколько реально это или не стоит заморачиваться?
Игорь Шевченко (2009-07-16 01:10:00) [1]antonn © (15.07.09 20:41) [23]
> значит система не передает в дельфийное окно координаты
> сообщениями
ClientToScreen - и у тебя экранные координаты сообщения.
Вообще странно, WH_GETMESSAGE вызывается непосредственно перед доставкой сообщения окну и координаты там должны быть клиентские.
antonn (2009-07-15 20:41:00) [2]обидно, значит система не передает в дельфийное окно координаты сообщениями (точнее вызывается GetCursorPos())? и хуком ее не "переубедить"?
Игорь Шевченко (2009-07-15 17:48:00) [3]
> Кто доставляет TControl сообщение WM_MOUSEMOVE?
TControl-у сообщение доставляет родительское окно (TWinControl). TWinControl-у соответственно, система - грубо говоря, через WindowFromPoint, преобразование экранных координат в клиентские и помещение сообщения в очередь потока, которому принадлежит окно
antonn (2009-07-15 14:51:00) [4]Up? :)
antonn (2009-04-06 17:27:00) [5]Up, слегка другой вопрос, уже дело принципа :)
Кто доставляет TControl сообщение WM_MOUSEMOVE?
ставлю хук на WH_GETMESSAGE, для нужного окна, фильтрую в нем WM_MOUSEMOVE и в TMsg().pt получаю экранные координаты. Их изменение работает лишь в одном случае - когда я таскаю окно за заголовок (если TMsg().pt.x:=10 то по горизонтали окно не таскается). При этом в WMMouseMove у TControl приходит структура TWMMouseMove с локальными координатами (не искаженными), кто их преобразует и кто формирует эту структуру (или как ее отловить то?)? Сам не могу найти откуда хвост :)
antonn (2009-04-05 23:49:00) [6]в общем наверное я зря пыхался и ставил хук на 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-05 22:28:00) [7]да, с DX, одна из dll импортирует Set/GetCursorPos, потому надеялся, что может через него получится провернуть (подменить функцию). Приложение оконное.
DVM (2009-04-05 15:00:00) [8]
> antonn © (05.04.09 02:16) [15]
>
> игрушка, не поддерживает нестандартные разрешения
Если она DirectX, то фокус с мышью может и не удастся.
Eraser (2009-04-05 02:43:00) [9]возможно стоит менять не размер окна, а его параметры масштабирования? http://frolov-lib.ru/books/bsp/v14/ch2_2.htm
antonn (2009-04-05 02:16:00) [10]игрушка, не поддерживает нестандартные разрешения (а есть вполне быстрые ноуты с 1024*600 разрешением :) ). Я меняю окну игры размер (изображение растягивается на всю форму), но клики идут по локальным координатам формы, хочу сделать так, чтобы клик шел по нужным элементам в игре, потому и ищу способ подменять координаты курсора с соблюдением масштаба :) т.е. игра как бы не знает, что буфер вывода изменил свои размеры.
Германн (2009-04-05 02:10:00) [11]
> antonn © (05.04.09 02:00) [11]
>
> не, окно один раз меняет свои размеры
Но ты ведь сам меняешь его размеры! Или нет?
Eraser (2009-04-05 02:10:00) [12]> [11] antonn © (05.04.09 02:00)
кстати раз уж ты тут упомянул масштабы. зачем вообще нужено [0]?
antonn (2009-04-05 02:02:00) [13]
> А почему этого вопроса нет на форуме Исходников?
потому что я ждал ответа "да/нет", а как оказалось че то не работает смена pt.x :)
завтра еще поковыряю примеры, если не получится - и там вопрос будет, но другой :)
antonn (2009-04-05 02:00:00) [14]не, окно один раз меняет свои размеры, контролов в окне нет.
а вот последующие клики в окно нужно делать в предыдущем масштабе, потому хочу научиться хотя бы координаты подменять, для одного окна :)
Германн (2009-04-05 01:59:00) [15]Хм 2.
А почему этого вопроса нет на форуме Исходников?
Германн (2009-04-05 01:45:00) [16]
> antonn © (05.04.09 01:37) [8]
>
>
> > Я, лично, не сомневаюсь.
> > Но зачем?
>
> окно ресайзю, масштабирование координат тычков курсора нужно
> (под новый размер окна)
>
Эээ.
Сначала клик, потом ресайз, потом переопределение координат? Так что-ли? Странная последовательность, не кажется?
Или я не правильно понял?
antonn (2009-04-05 01:37:00) [17]
> Я, лично, не сомневаюсь.
> Но зачем?
окно ресайзю, масштабирование координат тычков курсора нужно (под новый размер окна)
Германн (2009-04-05 01:32:00) [18]
> antonn © (05.04.09 01:03) [5]
>
>
> > А вот "честность твоего как раз под вопросом)
>
> достаточно честен, по крайней мере ничего не ломаю :)
>
Я, лично, не сомневаюсь.
Но зачем?
antonn (2009-04-05 01:07:00) [19]
> что передаются в обработчике - они не меняются
в смысле выводятся те, что передаются обработчиком, и "честные", от того, что я pt.x поменял толку нету, мож не там меняю.. :)
antonn (2009-04-05 01:03:00) [20]
> А вот "честность твоего как раз под вопросом)
достаточно честен, по крайней мере ничего не ломаю :)
> 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;