Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Новичок   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.063 c
15-1265037576
TStas
2010-02-01 18:19
2010.08.27
Что за файлы с расширением GID?


2-1267276280
lewka
2010-02-27 16:11
2010.08.27
Работа с архиватором


3-1242392291
denis24
2009-05-15 16:58
2010.08.27
обрыв канала связи,выключение сервера


4-1224075402
shurets
2008-10-15 16:56
2010.08.27
Создать профиль пользователя


15-1269120602
Юрий
2010-03-21 00:30
2010.08.27
С днем рождения ! 21 марта 2010 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский