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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2014, 22:11   #1
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию Не удаётся отлавливать хук для нестандартной формы

Добрый вечер! Глобальный хук отлавливать научился. Но всё хорошо работает на форме, которая уже даётся готовой, типа Form1, для которой определён класс TForm1.
Но простое приложение с одним компонентом Label, весит 290 кБ, что, я считаю, слишком жирновато для простой программы. Сделал минимальную форму по следующему коду
Код:
program Api;
uses Windows,Messages,MMSystem,SysUt;
{$R dialog.res}

var WinClass:TWndClass;//класс для главного окна
    Handle,Static,hInst:HWND;
    Mmsg:MSG;
    sc:Integer;

procedure SetKeyHook;stdcall;external 'HookKey.dll';
procedure DelKeyHook;stdcall;external 'HookKey.dll';

//----- процедура обработки сообщений ------------------------------------------
function WindowProc(wnd:HWND;Msg:Integer;WParam:WPARAM;LParam:LPARAM):LRESULT;stdcall;
begin
   case Msg of
   WM_Destroy://выход
   begin
      DelKeyHook;
      KillTimer(Handle,1);
      PostQuitMessage(0);
      Result:=0;
      Exit;
   end;
   wm_Create://при создании формы
   begin
      SetKeyHook;
      sc:=0;
      SetTimer(wnd,1,1000,nil);//установка таймера
   end;
   wm_Timer://что таймер делает
   begin
      sc:=sc+1;
      SetWindowText(wnd,PChar(WParam));//пишем в заголовке формы
      //SetWindowText(Static,PChar(IntToStr(WParam)));//или на форме
      //SetWindowText(Static,PChar(IntToStr(sc)));
   end;
   else
      Result:=DefWindowProc(wnd,Msg,WParam,LParam);
   end;
end;

begin
   //----- создание главного окна программы ------------------------------------
   hInst:=GetModuleHandle(nil);
   with WinClass do
   begin
      Style:=CS_PARENTDC;//стиль окна
      lpfnWndProc:=@WindowProc;
      hInstance:=hInst;
      hbrBackground:=COLOR_BTNFACE+5;//фон главного окна
      lpszClassName:='TForm';//окно
      hCursor:=LoadCursor(0,IDC_ARROW);//загрузка курсора
      hIcon:=LoadIcon(0,idi_application);
   end;
   RegisterClass(WinClass);
   Handle:=CreateWindowEx(0,'TForm','EXFar',WS_OVERLAPPEDWINDOW or WS_VISIBLE or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU,200,100,300,100,0,0,hInst,nil);
   //----- создаём окно ввода текста -------------------------------------------
   Static:=CreateWindowEx(0,'Static','Текст на форме',WS_CHILD or WS_VISIBLE,20,20,200,20,Handle,1,hInst,nil);
   //----- цикл обработки сообщений --------------------------------------------
   while GetMessage(Mmsg,0,0,0)do
   begin
      TranslateMessage(Mmsg);
      DispatchMessage(Mmsg);
   end;
end.
но как в неё прицепить процедуру отлавливания сообщений, которая хорошо работает на стандартной форме?
Код:
type TForm1=class(TForm)
     Label1:TLabel;
     procedure FormDestroy(Sender:TObject);
     procedure FormCreate(Sender:TObject);
     private{Private declarations}
     public
     procedure KeyMessageHandler(var Msg:TMessage);message $0400+1;
....
....
....
procedure TForm1.KeyMessageHandler(var Msg:TMessage);
begin
   Label1.Caption:=IntToStr(Msg.WParam);
end;
уже всю голову сломал. снова не знаю куда копать.
для желающих тоже в этом покопаться, выкладываю исходник.
модуль SysUtils заменил на урезанный SysUt - нужна только функция IntToStr для отображения результатов, и то, временно.
Вложения
Тип файла: rar Minimum.rar (13.4 Кб, 7 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 26.12.2014 в 22:15.
NetSpace вне форума Ответить с цитированием
Старый 26.12.2014, 23:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не пойму как ты хук связал с обработчиком сообщения...
Вообще твое procedure KeyMessageHandler(var Msg:TMessage);message $0400+1; можно сконвертировать в:
Код:
   case Msg of
   WM_Destroy://выход
   begin
...
   end;
   wm_Create://при создании формы
   begin
...
   end;
   wm_Timer://что таймер делает
   begin
...
   end;
   $0400+1:
   begin
Тут обработчик
   end;
   else
      Result:=DefWindowProc(wnd,Msg,WParam,LParam);
   end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.12.2014, 10:24   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну и где здесь установка хуков?
Хуки в принципе глобальные и будут автоматически отлавливать все окна.

Последний раз редактировалось waleri; 27.12.2014 в 10:26.
waleri вне форума Ответить с цитированием
Старый 27.12.2014, 15:47   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Уважаемый Stilet, по вашему примеру добавил 3 строчки и всё заработало! вот спасибо! опять ходил вокруг да около, а допенькать сам не смог
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 27.12.2014, 16:44   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Эт хорошо.
А я так и не допенькав как же ты хук умудрился с обработчиком о котором речь связать... Это наверное потому что я всю неделю сонный хожу после монтирования серверной стойки..
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук для буфера обмена PowerUSB Microsoft Office Access 7 20.02.2016 08:20
Не удаётся установить средства разработки программ для Android ak167 Мобильные ОС (Android, iOS, Windows Phone) 0 11.09.2013 23:13
Отлавливать сообщение WM_PASTE ololo23 Помощь студентам 4 16.03.2013 16:43
Отлавливать сообщения от Рунтайм созданных компонентов формы 100GRamm Общие вопросы Delphi 2 09.10.2011 15:56
Хук не работает при свертывании формы Denkot Помощь студентам 0 02.05.2010 10:45