Снова SetWindowHookEx
От: Spider84 Россия http://spider.vc
Дата: 30.10.02 08:31
Оценка:
Пытаюсь написать хук клавиатуры и сразу возникла проблема в написании DLL. При установки самого хука devenv.exe начинает жрать все 99.9% процесорного времени , но этого не происходит если в KeyboardProc оставить только:
return (int)CallNextHookEx(hdHookData->ghHook,nCode,wParam,lParam);

на самом деле DLL выглядит прмерно так:
#define WM_MYHOOKMSG (WM_USER+1)

HWND hCaller;
HHOOK ghHook;

BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved){
    ...
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode>=0)
    {
        PostMessage(hCaller,WM_MYHOOKMSG,wParam,lParam);

    }
    return (int)CallNextHookEx(hdHookData->ghHook,nCode,wParam,lParam);
}

HHOOK APIENTRY SetKeyHook(HWND CallerHwnd)
{
    if (ghHook) UnhookWindowsHookEx(hdHookData->ghHook);
    hCaller=CallerHwnd;
    ghHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstDLL,0);
    return ghHook;
}

void APIENTRY ReleaseHook(void)
{
    UnhookWindowsHookEx(ghHook);
}

Из программы вызываю SetKeyHook(hMainWnd); где hMainWnd это хендл моего окна, чтобы потом получать сообщения о хуках. Но в самой программе я WM_MYHOOKMSG ещё никак не обрабатываю. Я хук то поставить не могу
Re: Снова SetWindowHookEx
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.10.02 09:25
Оценка:
Здравствуйте Spider84, Вы писали:

S>Пытаюсь написать хук клавиатуры и сразу возникла проблема в написании DLL. При установки самого хука devenv.exe начинает жрать все 99.9% процесорного времени , но этого не происходит если в KeyboardProc оставить только:

S>
S>return (int)CallNextHookEx(hdHookData->ghHook,nCode,wParam,lParam);
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 очень долгая операция !


S> ghHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstDLL,0);
Re[2]: Снова SetWindowHookEx
От: Spider84 Россия http://spider.vc
Дата: 30.10.02 11:40
Оценка:
Здравствуйте old Dutchman, Вы писали:

S>>Пытаюсь написать хук клавиатуры и сразу возникла проблема в написании DLL. При установки самого хука devenv.exe начинает жрать все 99.9% процесорного времени , но этого не происходит если в KeyboardProc оставить только:

return (int)CallNextHookEx(hdHookData->ghHook,nCode,wParam,lParam);

>>на самом деле DLL выглядит прмерно так:
S>>
#define WM_MYHOOKMSG (WM_USER+1)
HWND hCaller; 
S>>

OD>Ты установил глобальный хук, а почему нет этого ?
#pragma data_seg(".shared")
#pragma data_seg()

А куда это?
OD>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send.
Как это "неизвестно куда", а хендл ей на что?
OD>А вообще PostMessage очень долгая операция !
Есть другие предложения?
Re[3]: Снова SetWindowHookEx
От: Patalog Россия  
Дата: 30.10.02 11:43
Оценка:
Здравствуйте Spider84, Вы писали:

[]

OD>>Ты установил глобальный хук, а почему нет этого ?

S>
S>#pragma data_seg(".shared")
S>#pragma data_seg() 
S>

S>А куда это?
OD>>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send.
S>Как это "неизвестно куда", а хендл ей на что?
OD>>А вообще PostMessage очень долгая операция !
S>Есть другие предложения?

[занудливо] Твои типа глобальные
HWND hCaller;
HHOOK ghHook;

на самом деле нихрена не глобальные, вот их то и надо запихать в расшаренную секцию.

ЗЫ. Млин, когда же уже народ поиском научиться пользоваться, подобные ньюанся уже сто раз перетирались.
Почетный кавалер ордена Совка.
Re[3]: Снова SetWindowHookEx
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.10.02 11:57
Оценка:
Здравствуйте Spider84, Вы писали:

S>#pragma data_seg(".shared")

S>#pragma data_seg()
S>[/ccode]
S>А куда это?

#pragma data_seg(".shared")
HWND hCaller;
#pragma data_seg()



OD>>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send.

S>Как это "неизвестно куда", а хендл ей на что?
А хендл в другом процессе будет неинициализированным !
Сегмент данных создается для каждого процесса. А инициализировал переменную ты только в одном.

OD>>А вообще PostMessage очень долгая операция !

S>Есть другие предложения?
А какие тебе надо ?
Глобальные хуки тормозят систему и точка. А за время, которое надо PostMessage можно уйму всего сделать
Re[4]: Снова SetWindowHookEx
От: Andrew S Россия http://alchemy-lab.com
Дата: 30.10.02 13:06
Оценка:
Более того, на сайте аж 2 статьи по этому поводу, таких, что даже самый начинающий имплементатор вполне разберется. Эххх.

P>ЗЫ. Млин, когда же уже народ поиском научиться пользоваться, подобные ньюанся уже сто раз перетирались.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Снова SetWindowHookEx
От: Spider84 Россия http://spider.vc
Дата: 30.10.02 18:08
Оценка:
Здравствуйте Andrew S, Вы писали:

P>>ЗЫ. Млин, когда же уже народ поиском научиться пользоваться, подобные ньюанся уже сто раз перетирались.

AS>Более того, на сайте аж 2 статьи по этому поводу, таких, что даже самый начинающий имплементатор вполне разберется. Эххх.
А где они там? Я что-то не нашёл, да сильно и не искал...
Re[4]: Снова SetWindowHookEx
От: Spider84 Россия http://spider.vc
Дата: 30.10.02 18:17
Оценка:
Здравствуйте old Dutchman, Вы писали:


#pragma data_seg(".shared")
HWND hCaller;
#pragma data_seg()


OD>>>Когда длл внедряется в другие процессы, PostMessage шлет сообщение неизвестно куда. Хорошо, что Post, а не Send.

S>>Как это "неизвестно куда", а хендл ей на что?
OD>А хендл в другом процессе будет неинициализированным !
OD>Сегмент данных создается для каждого процесса. А инициализировал переменную ты только в одном.
т.е. при установке хука перемаенная имела такое значение, а в следующей раз, например пришло сообщение о нажатии, эта переменная уже другая?

OD>>>А вообще PostMessage очень долгая операция !

S>>Есть другие предложения?
OD>А какие тебе надо ?
OD> Глобальные хуки тормозят систему и точка.
Ну я не вижу другово способа отслеживания нажатия нужных мне комбинаций, сидя в трее.
Re[6]: Снова SetWindowHookEx
От: Andrew S Россия http://alchemy-lab.com
Дата: 30.10.02 22:17
Оценка:
Да, оборжаться. Товарищи, старайтесь думать сами. Это помогает.

http://www.rsdn.ru/?article/default.asp?baseserv/winhooks.xml
Автор(ы): Kyle Marsh
Дата: 14.03.2001

Автор подробно описывает принципы работы хуков, их виды и случаи применения.
Статья не содержит примеров хуковых функций и носит лишь ознакомительный
характер. Рекомендуется программистам, только начинающим осваивать эту область
программирования для Windows.

http://www.rsdn.ru/?article/default.asp?baseserv/hookdll.xml
Автор(ы): Dr. Joseph M. Newcomer
Дата: 25.04.2001
Статья посвящена реализации глобальных хуков. В ней рассматриваются типичные проблемы, связанные
с различием виртуальных адресов перехватывающей DLL в адресных пространствах различных процессов, описывается
способ создания разделяемого сегмента данных, приводится пример DLL, реализующей глобальный хук.

http://www.rsdn.ru/?article/default.asp?baseserv/HookTools.xml
Автор(ы): Игорь Вартанов
Дата: 08.10.2002

S>А где они там? Я что-то не нашёл, да сильно и не искал...
А надо искать.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Снова SetWindowHookEx
От: old Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 31.10.02 08:15
Оценка:
Здравствуйте Spider84, Вы писали:

S>
S>#pragma data_seg(".shared")
S>HWND hCaller;
S>#pragma data_seg() 
S>


OD>>Сегмент данных создается для каждого процесса. А инициализировал переменную ты только в одном.

S>т.е. при установке хука перемаенная имела такое значение, а в следующей раз, например пришло сообщение о нажатии, эта переменная уже другая?

Нет. Глобальный хук — длл загружается во все процессы пользователя, кроме тех, что консольные.

Когда ты устанавливаешь хук — в этот момент длл загружена только в твой процесс. После того, как установил, она загружается во все остальные процессы. НО. Сегмент кода будет общим а сегмент данных будет отдельным у всех. С помощью прагмы data_seg(".shared") ты делаешь преременную одну на все экземпляры твоей длл.

Чтоб проверить — делай так

HWND hCaller = NULL;

KeyboardProc()
{
if(hCaller == NULL)
DebugBreak();
}



OD>>>>А вообще PostMessage очень долгая операция !

S>>>Есть другие предложения?
OD>>А какие тебе надо ?
OD>> Глобальные хуки тормозят систему и точка.
S>Ну я не вижу другово способа отслеживания нажатия нужных мне комбинаций, сидя в трее.
Значит надо грамотно писать сам хук.
Как вариант — вешать хук на определенные потоки. Их определять по главному окну и все.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.