Пытаюсь написать хук клавиатуры и сразу возникла проблема в написании DLL. При установки самого хука devenv.exe начинает жрать все 99.9% процесорного времени , но этого не происходит если в KeyboardProc оставить только:
Из программы вызываю SetKeyHook(hMainWnd); где hMainWnd это хендл моего окна, чтобы потом получать сообщения о хуках. Но в самой программе я WM_MYHOOKMSG ещё никак не обрабатываю. Я хук то поставить не могу
Здравствуйте Spider84, Вы писали:
S>Пытаюсь написать хук клавиатуры и сразу возникла проблема в написании DLL. При установки самого хука devenv.exe начинает жрать все 99.9% процесорного времени , но этого не происходит если в KeyboardProc оставить только: S>
S>на самом деле DLL выглядит прмерно так: S>[ccode] S>#define WM_MYHOOKMSG (WM_USER+1)
S>HWND hCaller; Ты установил глобальный хук, а почему нет этого ?
#pragma data_seg(".shared")
#pragma data_seg()
Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send. А вообще PostMessage очень долгая операция !
Здравствуйте old Dutchman, Вы писали:
S>>Пытаюсь написать хук клавиатуры и сразу возникла проблема в написании DLL. При установки самого хука devenv.exe начинает жрать все 99.9% процесорного времени , но этого не происходит если в KeyboardProc оставить только:
OD>Ты установил глобальный хук, а почему нет этого ?
#pragma data_seg(".shared")
#pragma data_seg()
А куда это? OD>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send.
Как это "неизвестно куда", а хендл ей на что? OD>А вообще PostMessage очень долгая операция !
Есть другие предложения?
S>А куда это? OD>>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send. S>Как это "неизвестно куда", а хендл ей на что? OD>>А вообще PostMessage очень долгая операция ! S>Есть другие предложения?
[занудливо] Твои типа глобальные
HWND hCaller;
HHOOK ghHook;
на самом деле нихрена не глобальные, вот их то и надо запихать в расшаренную секцию.
ЗЫ. Млин, когда же уже народ поиском научиться пользоваться, подобные ньюанся уже сто раз перетирались.
OD>>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send. S>Как это "неизвестно куда", а хендл ей на что?
А хендл в другом процессе будет неинициализированным !
Сегмент данных создается для каждого процесса. А инициализировал переменную ты только в одном.
OD>>А вообще PostMessage очень долгая операция ! S>Есть другие предложения?
А какие тебе надо ?
Глобальные хуки тормозят систему и точка. А за время, которое надо PostMessage можно уйму всего сделать
Более того, на сайте аж 2 статьи по этому поводу, таких, что даже самый начинающий имплементатор вполне разберется. Эххх.
P>ЗЫ. Млин, когда же уже народ поиском научиться пользоваться, подобные ньюанся уже сто раз перетирались.
Здравствуйте Andrew S, Вы писали:
P>>ЗЫ. Млин, когда же уже народ поиском научиться пользоваться, подобные ньюанся уже сто раз перетирались. AS>Более того, на сайте аж 2 статьи по этому поводу, таких, что даже самый начинающий имплементатор вполне разберется. Эххх.
А где они там? Я что-то не нашёл, да сильно и не искал...
OD>>>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send. S>>Как это "неизвестно куда", а хендл ей на что? OD>А хендл в другом процессе будет неинициализированным ! OD>Сегмент данных создается для каждого процесса. А инициализировал переменную ты только в одном.
т.е. при установке хука перемаенная имела такое значение, а в следующей раз, например пришло сообщение о нажатии, эта переменная уже другая?
OD>>>А вообще PostMessage очень долгая операция ! S>>Есть другие предложения? OD>А какие тебе надо ? OD> Глобальные хуки тормозят систему и точка.
Ну я не вижу другово способа отслеживания нажатия нужных мне комбинаций, сидя в трее.
OD>>Сегмент данных создается для каждого процесса. А инициализировал переменную ты только в одном. S>т.е. при установке хука перемаенная имела такое значение, а в следующей раз, например пришло сообщение о нажатии, эта переменная уже другая?
Нет. Глобальный хук — длл загружается во все процессы пользователя, кроме тех, что консольные.
Когда ты устанавливаешь хук — в этот момент длл загружена только в твой процесс. После того, как установил, она загружается во все остальные процессы. НО. Сегмент кода будет общим а сегмент данных будет отдельным у всех. С помощью прагмы data_seg(".shared") ты делаешь преременную одну на все экземпляры твоей длл.
OD>>>>А вообще PostMessage очень долгая операция ! S>>>Есть другие предложения? OD>>А какие тебе надо ? OD>> Глобальные хуки тормозят систему и точка. S>Ну я не вижу другово способа отслеживания нажатия нужных мне комбинаций, сидя в трее.
Значит надо грамотно писать сам хук.
Как вариант — вешать хук на определенные потоки. Их определять по главному окну и все.