Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.005 c
15-1294859352
Внук
2011-01-12 22:09
2011.04.24
Исправления в DOA


15-1294649384
tat'yanka
2011-01-10 11:49
2011.04.24
Дифрагментация дискового пространства


6-1191246733
__Unnamed__
2007-10-01 17:52
2011.04.24
Вопрос про сокеты, а точнее про FD_CLOSE и FD_READ


15-1294842288
aka
2011-01-12 17:24
2011.04.24
кто знаток в PHP?


1-1252579314
webpauk
2009-09-10 14:41
2011.04.24
тень





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский