Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как перехватывать сообщения заменяя буквы в люб...


Автор: virtul 3.2.2009, 11:49
Люди!
Такое дело:
У меня проблема с прогой.
Мне нужно сделать прогу для перехвата системных сообщений клавиатуы.
короче я использую прогу и биб.dll
---------------------
прога:
Код

...
var
  PSSKDNRN: TPSSKDNRN;
  procedure PSSKDNRN_RSHook(State : Boolean) stdcall;
  external 'psskdnrn.dll' index 1;


implementation

{$R *.dfm}

procedure TPSSKDNRN.FormShow(Sender: TObject);
begin
  PSSKDNRN_RSHook(true);
end;

procedure TPSSKDNRN.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PSSKDNRN_RSHook(false);
end;

procedure TPSSKDNRN.FormActivate(Sender: TObject);
begin
  ShowWindow(Handle,SW_HIDE);
  ShowWindow(Application.Handle,SW_HIDE);
end;
end.

---------------------
Библиотека Dll
Код

library psskdnrn;

uses Windows, Messages;
var
  SysHook : HHook = 0;
  Wnd : Hwnd = 0;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
CallNextHookEx(SysHook, Code, wParam, lParam);
if code = HC_ACTION then
begin
  Wnd := TMsg(Pointer(lParam)^).hwnd;
   if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
  if ((TMsg(Pointer(lParam)^).wParam and ord('A')) = ord('A')) then
  begin
...//как поменят мессаге допустим вводим букву А, а вместо неё получаем Ф(в люом октивном окне где пишем)
    InvalidateRect(Wnd, nil, true);
    end;
  end;
end;

procedure PSSKDNRN_RSHook(State : Boolean) export; stdcall;
begin
  if State=true then
begin
  SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
end
else
begin
  UnhookWindowsHookEx(SysHook);
  SysHook := 0;
end;
end;
exports PSSKDNRN_RSHook index 1;
end.

----------------------
можешь помочь с function SysMsgProc
Я не знаю как перехватить сообщение допустим с буквой 'A' чтобы место неё в люом окне вводилось допустим 'Ф'.
я думал может в ord переводить но эфекта небыло.
Может вместо SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0); надо SysHook := SetWindowsHookEx(wh_Keyboard, @Key_Hook, HInstance, 0);
но чё при это надо?
Я не хочу заменять сообщения.
Мне чё надо:
Человек врубил комп, он на анг раскладке(hook включён), пишет в любом окне, в любом текстовом поле := privet 
а выходило := привет
и ещё: как в любом окне, текстовом поле удалять программно по одному символу при нажатии допустим буквы Y
Кто может помочь?

Автор: virtul 6.2.2009, 11:49
Ну хоть кто нибудь может помочь?  smile 

Автор: dumb 6.2.2009, 13:12
Цитата(virtul @  6.2.2009,  11:49 Найти цитируемый пост)
Ну хоть кто нибудь может помочь?
с учетом той бессмысленной каши, что у тебя написана в коде, тебе поможет, для начала, любая добротная книга по программированию на Delphi.

Автор: virtul 6.2.2009, 19:25
Цитата

с учетом той бессмысленной каши, что у тебя написана в коде, тебе поможет, для начала, любая добротная книга по программированию на Delphi.

^^^^^^
Чтобы так с кем то говорить нужно хотябы пред-историю знать(или для начала хотябы человека)!
Во первых:
Я искал везде, и в книгах, и в нете.
но несказано негде как заменять через сообщения текст в любой проге.
Во вторых:
Код хука я взял из одной книги.
он заменял звёзды в поле ввода пароля на символы(открывет пароль).
Я поэтому и спрашиваю.

------------------------------------------------------------------------------------------------

M
Rrader
Предыстория, говоришь...Так она в первом посте вся - "скопипащенный" невесть откуда код (там как минимум 10 грубых ошибок) неизвестно для каких целей. Как бы то ни было, dumb дал исчерпывающий ответ на твой вопрос.


Тема закрывается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)