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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2011, 17:27   #1
AndruXaII
 
Регистрация: 21.09.2011
Сообщений: 3
По умолчанию Неработает перехват событий от клавиатуры

Вобщем есть програмка которая по нажатию клавишы F12 в любом активном приложении должна выполнять некие действия.
Dll и программа успешно компилятся, ошыбок ен выдает, но по нажатию F12 ничего не происходит, если ктонибуть может указать ан ошыбку или просто подсказать в каком направлении капать, зарание большое спасибо.

Собственно код dll:

Код:
library SendKey;

uses
  WinTypes,
  WinProcs,
  Messages;      

const
    wm_KlikONOFF_event = wm_User +133;
  var
    HookHandle: hHook = 0;
    SaveExitProc: Pointer;

  function Key_Hook(Code: Integer; wParam: Word; lParam: Longint):LongInt; stdcall; export;
   var
     H:HWND;
   begin
     if Code>=0 then
       begin
        if  (wParam = VK_F12)  and (lParam and $40000000 =0) then
         begin
           H:=FindWindow('TForm1','Feldsher');
           SendMessage(H, wm_KlikONOFF_event,0,0);
         end;
        Result:=0;
       end
      else
       Result:=CallNextHookEx(HookHandle, Code, wParam, lParam);
   end;

  procedure LocalExitProc; far;
   begin
     if HookHandle<>0 then
      begin
        UnhookWindowsHookEx(HookHandle);
        ExitProc:= SaveExitProc;
      end;
   end;

  exports Key_Hook;
{$R *.res}

begin
  HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);
  if HookHandle =0 then
    MessageBox(0,'Íåóäàëîñü ïîñòàâèòü ëîâóøêó','Error',MB_OK)
   else
   begin
     SaveExitProc:=ExitProc;
     ExitProc:=@LocalExitProc;
   end;

end.
Код самой программы:

Код:
unit kl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  wm_KlikONOFF_Event = wm_User + 133;
type
  TForm1 = class(TForm)
    lbl1: TLabel;
    edt1: TEdit;
    procedure Create(Sender: TObject);
  private
    { Private declarations }
    Procedure wm_actFeldsher(var M: TMessage); message wm_KlikONOFF_event;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  P:Pointer;

implementation

{$R *.dfm}

function Key_Hook: LongInt; far; external 'SendKey';

procedure TForm1.Create(Sender: TObject);
begin
  P:=@Key_Hook;
end;

procedure TForm1.wm_actFeldsher(var M: TMessage);
 begin
   edt1.Text:='1';
 end;

end.
свойство Caption формы = Feldsher

Последний раз редактировалось rpy3uH; 22.09.2011 в 11:08.
AndruXaII вне форума Ответить с цитированием
Старый 21.09.2011, 21:13   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Как минимум нельзя ставить хук при загрузке dll, потому что после установки хука она будет грузиться в другие процессы, в каждом из которых будет выполняться эта инициализация dll.
Потом
Код:
function Key_Hook: LongInt; far; external 'SendKey';
Как Key_Hook используется в основной проге? Если она где-то непосредственно вызывается, то тут не хватает stdcall.
Somebody вне форума Ответить с цитированием
Старый 23.09.2011, 01:10   #3
AndruXaII
 
Регистрация: 21.09.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Как Key_Hook используется в основной проге? Если она где-то непосредственно вызывается, то тут не хватает stdcall.
Помогло, Спасибо

Цитата:
Сообщение от Somebody Посмотреть сообщение
Как минимум нельзя ставить хук при загрузке dll, потому что после установки хука она будет грузиться в другие процессы, в каждом из которых будет выполняться эта инициализация dll.
М, ну я собственно этого и добивался, мне нужно чтобы при нажатии клавишы F12 в любом окне, программа выполняла некие действия, для этого ловушка ставится во всех процесах. Или я чтото не так понял?

Последний раз редактировалось AndruXaII; 23.09.2011 в 01:14.
AndruXaII вне форума Ответить с цитированием
Старый 23.09.2011, 12:46   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
begin
  HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);
...
end.
выполняется при загрузке в каждый процесс - можно добавить Beep и послушать. Надо бы экспортировать отдельную функцию, которая ставит хук, и вызывать её.
Somebody вне форума Ответить с цитированием
Старый 27.09.2011, 20:05   #5
AndruXaII
 
Регистрация: 21.09.2011
Сообщений: 3
По умолчанию

Я видимо слишком чайник и чегото не понимаю.

Поправте если ошыбусь: при нажатии клавишы винда посылает сообщение в текущее активное окно, активное окно нам не известно и надо перехватить это сообшение и послать другое, уже моей программе, для этого в каждый процес при загрузке программы атоматически помещяется ловушка. Или я не прав?

Зарание благодарен.
AndruXaII вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват событий принтера Kazik Помощь студентам 1 02.06.2011 21:28
Перехват клавиатуры Ferro Общие вопросы Delphi 3 25.03.2010 21:02
Перехват событий клавиатуры и мыши (X system) damned20 Qt и кроссплатформенное программирование С/С++ 4 26.02.2010 12:18
Перехват событий клавиатуры и мыши (X system) damned20 Общие вопросы C/C++ 0 25.02.2010 09:40
Перехват событий клавиатуры CODeRUS Win Api 8 06.07.2009 11:08