Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

подмена координат клика курсора для определенного окна [D7, WinXP]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо