Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.11.2010, 12:44
Kompuklumba Kompuklumba вне форума
Прохожий
 
Регистрация: 01.11.2010
Сообщения: 5
Репутация: 10
По умолчанию после удаления hook вешается ОС

Загружаю ловушку при запуске программы, отрабатывает она нормально, закрываю приложение и по событию OnClose пытаюсь отключить ловушку. Получается что вешается вся ось... где касяк понять не могу, вот текст библиотеки.
Код:
library DynHelp;

uses
  ShareMem,
  SysUtils,
  Classes,
  StdCtrls,
  AppEvnts,
  ComCtrls,
  Forms,
  Windows,
  Controls,
  Messages;

var
  CMemo: TCustomMemo;
  HandleHook: HHOOK = 0;
{$R *.res}

  //процедура на ловушку
  procedure Hook(Code: integer; wParam: integer; lParam: integer); stdcall;
  begin
    CallNextHookEx(HandleHook, Code, wParam, lParam);
    if Code = HC_ACTION then
      if TMSg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
        if (TMSg(Pointer(lParam)^).wParam and MK_CONTROL) = MK_CONTROL then
        begin                               
          MessageBox(TMSg(Pointer(lParam)^).hwnd, PChar(IntToStr(lParam)),
              '!!!', mb_iconhand);
        end;

  end;

  procedure DynHelpConnection(CustomMemo: TCustomMemo; ThreadID: Cardinal);
      stdcall; export;
  begin
    if (CustomMemo.ClassName = 'TMemo') then
    begin
      CMemo := CustomMemo;
      HandleHook := SetWindowsHookEx(WH_GETMESSAGE, @Hook, HInstance, 0);
    end;
  end;

  procedure DynHelpDisconnection; stdcall; export;
  begin
    UnhookWindowsHookEx(HandleHook);
    HandleHook := 0;
    CMemo := nil;
  end;

exports
  DynHelpConnection,
  DynHelpDisconnection;

begin
end.
Ответить с цитированием
  #2  
Старый 08.11.2010, 10:48
Kompuklumba Kompuklumba вне форума
Прохожий
 
Регистрация: 01.11.2010
Сообщения: 5
Репутация: 10
По умолчанию

Можно закрывать тему, решение найдено. Следовало устанавливать ловушку следующим способом
Цитата:
HandleHook := SetWindowsHookEx(WH_GETMESSAGE, @Hook, 0, GetCurrentThreadId);
Ответить с цитированием
  #3  
Старый 08.11.2010, 11:23
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

да ну?
Цитата:
dwThreadId [in]

The identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.
http://msdn.microsoft.com/en-us/libr...90(VS.85).aspx
зачем ловушка только для твоего процесса?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 09.11.2010, 15:39
Kompuklumba Kompuklumba вне форума
Прохожий
 
Регистрация: 01.11.2010
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
да ну?
Ну да!
А этот help я читал.
Цитата:
зачем ловушка только для твоего процесса?
Это не полный вариант. Тут система подсказок будет отрабатывать (не хинт)
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025