Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Зависание меню после установки хука   Найти похожие ветки 

 
Новичок   (2009-03-25 11:13) [0]

Добрый день.
Пожалуйста помогите разобраться с хуками. Ситуация такая: устанавливаю локальный хук на мышь и клавиатуру в MDI приложении. Задачей хука является отсылка уведомления в главное окно. При попытке выбрать мышкой пункт выпадающего меню, не главного!,  а, например, "Главное->Файл->Открыть", приложение замерзает. Более того, ощутимо начинает тормозить система пока не срубишь это приложение. Проблема решается заменой PostMessage в коде хука на SendMessage. Причем проблема не возникает если выбирать меню с клавиатуры! Не могли бы Вы объяснить причину происходящего?!

implementation

....

var
 KbrdInputHook: HHOOK = 0;
 MouseInputHook: HHOOK = 0;

function KbrdHookProc(code: integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
 Result:= CallNextHookEx(KbrdInputHook, code, wparam, lparam);
 if code >= 0 then
   begin
     PostMessage(Application.MainForm.Handle, FRX_IDLE_USER_INPUT, 0, 0);
   end;
end;

function MouseHookProc(code: integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
 Result:= CallNextHookEx(MouseInputHook, code, wparam, lparam);
 if code >= 0 then
   begin
     PostMessage(Application.MainForm.Handle, FRX_IDLE_USER_INPUT, 0, 0);
   end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 KbrdInputHook:= SetWindowsHookEx(WH_KEYBOARD, @KbrdHookProc, 0, MainThreadID);
 MouseInputHook:= SetWindowsHookEx(WH_MOUSE, @MouseHookProc, 0, MainThreadID);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 if KbrdInputHook <>0 then UnhookWindowsHookEx(KbrdInputHook);
 if MouseInputHook <> 0 then UnhookWindowsHookEx(MouseInputHook);
end;


 
Сергей М. ©   (2009-03-25 12:04) [1]

Не понятна сама затея с хуком ..

Если хук устанавливается на основной поток процесса своего собственного приложения, то что мешает вместо этого просто обрабатывать событие выбора пункта интересующего меню или событие выполнения акции, ассоциированной с этим пунктом меню ?


 
Новичок   (2009-03-25 12:21) [2]

Обработка действия по пункту меню здесь абсолютно не при чем. Просто возникает проблема с меню при установленом хуке. Задача заключается в том, чтобы отследить отсутствие клавиатурно/мышиного ввода от пользователя.

Удалось найти решение!
В процедуре условие


if code >= 0 then
  begin
    PostMessage(Application.MainForm.Handle, FRX_IDLE_USER_INPUT, 0, 0);
  end;

изменяется на

if code = HC_ACTION then
  begin
    PostMessage(Application.MainForm.Handle, FRX_IDLE_USER_INPUT, 0, 0);
  end;

и все работает!!!

Просто получается так, что если в момент прихода code = HC_NOREMOVE отправлять PostMessage.. то приложение попадает в мертвую петлю. В общем, решение вроде как найдено, но основного вопроса это не снимает:
Не могли бы Уважаемые Мастера доступно объяснить суть происходящего? Спасибо за внимание.


 
Сергей М. ©   (2009-03-25 12:36) [3]


> доступно объяснить суть происходящего

https://wasm.ru/forum/viewtopic.php?id=12047


> отследить отсутствие клавиатурно/мышиного ввода от пользователя


А если юзер просто тупо бесцельно елозит мышью, это разве не считается мышиным вводом ?


 
Новичок   (2009-03-25 12:54) [4]

Насчет бесцельного тыканья мышью - вопрос десятый. Я потом напишу необходимые проверки. Это просто демонстрационный пример.

Спасибо за ссылку. По тексту все равно не понял, почему мой PostMessage вгоняет систему в ступор.


 
Сергей М. ©   (2009-03-25 13:06) [5]


> все равно не понял


Windows вызывает хук WH_KEYBOARD/WH_MOUSE с кодом HC_NOREMOVE, когда клавиатурное/мышиное сообщение не удаляется из очереди, потому что приложение вызвало функцию PeekMessage с параметром PM_NOREMOVE.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.071 c
2-1269309875
r_yevgeniy
2010-03-23 05:04
2010.08.27
Сохранить данные в файл из двух компонентов StringGrid


15-1272339322
Девелопер
2010-04-27 07:35
2010.08.27
Свойства бинарника и директивы компилятора


2-1272565792
Bee
2010-04-29 22:29
2010.08.27
single and string


8-1203001110
][aker
2008-02-14 17:58
2010.08.27
Проблемы с Tmediaplayer у начинающего лузера


15-1265062916
DillerXX
2010-02-02 01:21
2010.08.27
Где в ХР лежит файл с обоями на десктопе?