Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2024, 21:51   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Подмена нажатия кнопок

Недавно скачал "X-Mouse Button Control"
И возник вопрос: а как самостоятельно сделать программу, которая бы перехватывала нажатие и подменяла его?

Конкретно что меня интересует - чтобы программа подменяла нажатие боковой кнопки на нажатие шифта. При чем, не зависимо от того, какая форма активна

И чтобы пока зажата боковая - программа считала шифт нажатым.

Последний раз редактировалось Kronos913; 12.04.2024 в 21:56.
Kronos913 вне форума Ответить с цитированием
Старый 13.04.2024, 12:33   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

глобальный хук на всю систему надо ставить. он отлавливает событие нажатия клавиши и заменяет его другим кодом. типа, нажимаешь пробел, а тебе ставит букву А.
------
где-то тут на форуме это было.
один из шагов - это скомпилировать библиотеку Hook.dll, чтоб потом его ставить и удалять из системы.
Код:
library HookKey;
//----- типы переменных и функции вытащил из модуля Windows.pas ----------------
type TKeyboardState=array[0..255]of Byte;
     TFNHookProc=function(code:Integer;wparam:LongInt;lparam:LongInt):LongInt;stdcall;
function CallNextHookEx(hhk:LongWord;nCode:Integer;wParam:LongInt;lParam:LongInt):LongInt;stdcall;external 'user32.dll' name 'CallNextHookEx';
function FindWindow(lpClassName,lpWindowName:PChar):LongWord;stdcall;external 'user32.dll' name 'FindWindowA';
function GetKeyboardState(var KeyState:TKeyboardState):LongBool;stdcall;external 'user32.dll' name 'GetKeyboardState';
function PostMessage(hWnd:LongWord;Msg:LongWord;wParam:LongInt;lParam:LongInt):LongBool;stdcall;external 'user32.dll' name 'PostMessageA';
function SetWindowsHookEx(idHook:Integer;lpfn:TFNHookProc;hmod:LongWord;dwThreadId:LongWord):LongWord;stdcall;external 'user32.dll' name 'SetWindowsHookExA';
function UnhookWindowsHookEx(hhk:LongWord):LongBool;stdcall;external 'user32.dll' name 'UnhookWindowsHookEx';

var HookHandle:LongWord=0;
    KeybrdState:TKeyboardState;
//----- в параметре WParam передаём код клавиши --------------------------------
function KeyHook(code,WParam,LParam:LongWord):LongWord;stdcall;
begin
   if(code=0)then
   begin
      GetKeyboardState(KeybrdState);
      PostMessage(FindWindow(nil,'EXFar'),$0400+1,WParam,0);
   end;
   Result:=CallNextHookEx(HookHandle,code,WParam,0);
end;

//----- ставим хук -------------------------------------------------------------
procedure SetKeyHook;stdcall;export;
begin
   if(HookHandle=0)then HookHandle:=SetWindowsHookEx(2,@KeyHook,hInstance,0);
end;

//----- удаляем хук ------------------------------------------------------------
procedure DelKeyHook;stdcall;export;
begin
   if(HookHandle<>0)then UnHookWindowsHookEx(HookHandle);
   HookHandle:=0;
end;

exports SetKeyHook,DelKeyHook;//экспортируем процедуры в другие программы

begin
end.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 13.04.2024 в 12:38.
NetSpace вне форума Ответить с цитированием
Старый 13.04.2024, 12:41   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

потом в своём модуле подключаешь этот DLL
Код:
implementation
procedure SetHook;stdCall;external'HookKey.dll';
procedure UnHook;stdCall;external'HookKey.dll';
{$R *.DFM}
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 13.04.2024, 12:43   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

и уже сам решаешь, где и как будешь ставить его и удалять. в примере как раз при создании формы и при её уничтжении. но можешь сделать и по нажатию кнопок...
Код:
procedure TForm1.FormCreate(Sender:TObject);
begin
   SetKeyHook;
end;

procedure TForm1.FormDestroy(Sender:TObject);
begin
   DelKeyHook;
end;
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 13.04.2024, 12:50   #5
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

делал на основе этого хука файловый менеджер, по принципу двух окон, как FAR или TotalCommander, но за основу брал два окна проводника. что-то доделал, что-то не стал - переключился на другой проект, более важный на тот момент.
там можешь много чего удалить лишнего и из папки, и из самого кода. но он рабочий благодаря хуку.
TAB - переключение между окнами
F7 -создать папку
DEL - удалить объект.
и т.д. - надписи на кнопках расскажут.
Вложения
Тип файла: rar EXFAR3.rar (835.4 Кб, 7 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 13.04.2024 в 13:05.
NetSpace вне форума Ответить с цитированием
Старый 13.04.2024, 15:32   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

А возможно ли добавить это не как еще один dll, а как часть программы?

Кстати, внешняя программа проблему полностью так и не решила. Всё равно проблема с боковой кнопкой есть
Kronos913 вне форума Ответить с цитированием
Старый 13.04.2024, 22:12   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

не знаю, не пробовал такое сварганить. попробуйте перенести код DLL в тело своей программы.
------------
ну, если дело принципа, чтоб не таскать за приложением посторонние файлы (тоже такое люблю), то поместите его в файл ресурса и извлекайте по мере надобности, а при закрытии - удаляйте.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 14.04.2024, 15:31   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
А возможно ли добавить это не как еще один dll, а как часть программы?
Странно, что отвечающий выше не знает или забыл матчать. Из описания функции SetWindowsHookExA:
Цитата:
For a specified hook type, thread hooks are called first, then global hooks. Be aware that the WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL, and low-level hooks can be called on the thread that installed the hook rather than the thread processing the hook. For these hooks, it is possible that both the 32-bit and 64-bit hooks will be called if a 32-bit hook is ahead of a 64-bit hook in the hook chain.

The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries.
Vapaamies вне форума Ответить с цитированием
Старый 14.04.2024, 16:14   #9
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

посмотрите мой первый комментарий там в коде DLL есть эта функция.
--------------
локальный хук отслеживает только те события, которые происходят только в одной программе (или потоке). глобальный хук отслеживает события во всей системе (во всех потоках). оба типа хуков устанавливаются одинаково, однако единственно отличие заключается в том, что локальная ловушка вызывается в пределах вашего приложения, в то время как глобальный хук необходимо хранить и вызывать из отдельной DLL.
------------
автору надо, чтоб работало не зависимо от того, какая форма активна -значит, надо делать глобальный хук. DLL+ своя программа отдельно, а не в одном проекте.
-----------
вот, чего ты такой вредный, Vapppmies?! это вообще за всю мою историю мучания Delphi единственная DLL, которую я делал аж 4 года назад - уже и забыл все тонкости. короче, я ему дал рабочий код, а нерабочий он сможет из него сделать сам, когда сделает всё в одном проекте.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 14.04.2024 в 16:25.
NetSpace вне форума Ответить с цитированием
Старый 14.04.2024, 22:53   #10
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
короче, я ему дал рабочий код
А я матчасть.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сообщения нажатия кнопок decantnik Win Api 2 12.04.2012 19:23
Обработка нажатия кнопок мыши turbovitalik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 12.09.2011 08:49
Эмуляция нажатия кнопок!!(по таймеру!!) Танкист Win Api 11 01.03.2010 08:46
Перехват нажатия кнопок мыши DarkEvil Win Api 7 15.06.2009 22:38