![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
блокирока мыши и клавы в чужом приложении не трогая своё [D6]
Novichek © (2002-10-10 02:19:00)можно ли блокировать мышь и клаву в чужом приложении но не трогая свою(мои горячие клавиши, простой ввод(hook) и т.д.)?
Novichek (2002-10-14 00:20:00) [1]Song> все равно не работает
Vit@ly (2002-10-13 23:43:00) [2]Опуститесь на землю. Мышь и клавиатура не принадлежат ни программе, ни процессу - это собственность "операциоки". И ИМХО можно закочить дискуссию. Хотя не "авторитет" в последней инстанции.
Song (2002-10-13 22:26:00) [3]L это LParam
Novichek (2002-10-13 16:29:00) [4]а мышь все равно не блокируется ни в моем ни в чужом! можно ли тогда заблокировать мышь полностью(с возможностью разблокировки) и в моем и в чужом приложении, но нетрогая клавиатуру?
Novichek (2002-10-13 16:12:00) [5]Diamond Cat >
if TMOUSEHOOKSTRUCT(Pointer( L)^).hwnd=ShareInf^.AppWndHandle then
а что эта за переменная Lи что с ней делать?
Diamond Cat (2002-10-11 23:10:00) [6]2 Rouseкруто, опознование своего окна через проверку его положения по оси z..... дельный совет
2 Novichekконечно не работает с мышью, ведь ловушка установлена только на клаву. придется сделать и на мышь, исходя из приведенного кода что-то типа
Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
if TMOUSEHOOKSTRUCT(Pointer(L)^).hwnd=ShareInf^.AppWndHandle then
SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamW, Code)
else exit;
End;
Result := CallNextHookEx(ShareInf^.mouseHookHandle, Code, ParamW, ParamL)
End;
Function SetmousedHook(Wnd: HWND): BOOL; stdcall;
Begin
If ShareInf<>Nil Then
Begin
ShareInf^.AppWndHandle:=Wnd;
ShareInf^.mousehookhandle:=SetWindowsHookEx(WH_mouse, @mouseHook, HInstance, 0);
Result:=ShareInf^.mouseHookHandle<>0;
End
Else Result:=False
End;
надо только добавить к существующей TShareInf еще один параметр типа HHook; т.е.
TShareInf= Record
AppWndHandle: HWND;
mousehookhandle,OldHookHandle: HHOOK;
hm:THandle;
End;
ну и не зыбыть выгрузить ловушку
код не проверял но вроде должен работать
удачи
Novichek (2002-10-11 18:46:00) [7]Rouse_ © >> спасибо, только мышь то все равно активная...
Song (2002-10-11 09:12:00) [8]Надо было просто запретить мыше ездить за пределы своих форм, а клаву забить хуком.
Rouse_ (2002-10-11 07:01:00) [9]Мда, поспал хорошо, и сразуже увидел всю сумбурность своих вчерашних высказываний ;) Не пинайте меня просто долгое сиденье за отладкой кода притупляет мозги
Вот решение
Изменить функцию в библиотеке
Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var tmp: THandle;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
tmp := GetForegroundWindow; //Вот здесь проверка
SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamL, Code);
if tmp <> ShareInf^.AppWndHandle then Exit; //Блокируем все сообщения не нашей программе
End;
Result := CallNextHookEx(ShareInf^.OldHookHandle, Code, ParamW, ParamL);
End;
Как результат смотрим какое приложение активно, и если не наше, то просло не пересылаем сообщение о нажатой клавише дальше по цепочке хуков
Желаю успехов
ЗЫ: Продублирую мылом
Rouse_ (2002-10-10 08:32:00) [10]
> vidiv (10.10.02 08:16)
Я же говорил что могу ошибаться, спасибо что поправили ;)
Novichek (2002-10-10 08:25:00) [11]попробуй, мой е-майл: sanek@sed.lg.uaтолько ж ты понял какая задача? блок клавы и мыши вовсех приложениях кроме моего, а в моем отображение набора клавы после блока приложений (моя прога, после блокировки клавиатуры и мыши, в граф режиме отображает на мониторе символы приходящие с клавы и плюс анализирует их) помоги пожалуйста, если можешь.
Rouse_ (2002-10-10 08:16:00) [12]Давай так, я сегодня просто всю ночь просидел, голова уже просто не соображает, я как только прийду в себя сяду и сделаю с нуля все что тебе нужно, а потом тебе почтой отошлю ок? Я вчера так тоже двоим сделал, просто сейчас я действительно уже начинаю похуже вникать. А за это время мож кто-то еще что посоветует
Желаю успехов
vidiv (2002-10-10 08:16:00) [13]Rouse_ >> Code - это не код нажатой клавиши, последний в Param-ах где-то.
Вот из helpa:
LRESULT CALLBACK KeyboardProc(
int code, // hook code - но не как ни код нажатой клавиши
WPARAM wParam, // virtual-key code - вот он код
LPARAM lParam // keystroke-message information
);
>>
А к стати Novichek, а без Dll слабо сделать
vidiv (2002-10-10 08:14:00) [14]Rouse_ >> Code - это не код нажатой клавиши, последний в Param-ах где-то.
>>
А к стати Novichek, а без Dll слабо сделать
Novichek (2002-10-10 08:04:00) [15]один хрен, не работает :(((((( ну хоть плач...
Rouse_ (2002-10-10 07:55:00) [16]Не-не CODE = код нажатой клавиши а handle либо в ParamW либо в ParamL, я вот и говорю, что не помню точно
Желаю успехов
Novichek (2002-10-10 07:44:00) [17]дурацкий вопрос, но всё же => CODE и handle моей проги одно и тоже? если нет, то где вставить проверку?
Rouse_ (2002-10-10 07:35:00) [18]Просто пропускаешь все сообщения адресованные твоей программе, а для остальных CODE заменяешь на ноль (как будто ничего не нажималось)
BlockInput соответственно снять
Желаю успехов
Novichek (2002-10-10 07:25:00) [19]да, но я то блокирую все приложения (BlockInput"ом)! (соответственно и своё) а как заблокировать все кроме моего?
Rouse_ (2002-10-10 07:02:00) [20]Там как раз передаются параметры какая клавиша нажата и какому приложению адресовано сообщение (вот точно что где не помню а проверять лениво я просто через час выхожу из инета а у нас с тобой еще запуск эксплорера не решен) посмотри тем же стартером какой хэндр у интересуещего тебя приложения и посмотри где он проходит в каком параметре, а после просто делаешь, смотришь если сообщение идет нужному приложению то просто меняешь Code на ноль
Кажется так
Желаю успехов