Форум: "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