Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > SetWindowsHookEx


Автор: User008 28.10.2010, 08:24
Код


LRESULT CALLBACK MouseProc(
  __in  int nCode,
  __in  WPARAM wParam,
  __in  LPARAM lParam
)
{
    ::MessageBox(0,0,0,0);
    return 0;
}

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//...
    SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle(0), 0);
}

Ожидал, что childframe будет перехватывать сообщения мыши всех представлений и вызывать MouseProc. Но ничего не перехватывается. Что сделано неправильно?

Автор: icecrashldr 28.10.2010, 10:36
Цитата

Что сделано неправильно? 

Документация не прочитал, не в том месте вопрос задал, не прогугглился ? Этого мало?

http://msdn.microsoft.com/en-us/library/ms644990%28VS.85%29.aspx

Автор: User008 28.10.2010, 21:53
Цитата(icecrashldr @  28.10.2010,  10:36 Найти цитируемый пост)
Документация не прочитал, не в том месте вопрос задал, не прогугглился ? Этого мало?http://msdn.microsoft.com/en-us/library/ms...28VS.85%29.aspx

Тогда прошу показать, где в мсдн или гугле расположен ответ на мой вопрос, я не нашёл.

Автор: icecrashldr 29.10.2010, 11:49
User008, 

MSDN
Цитата

A handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process. 

Remarks

SetWindowsHookEx can be used to inject a DLL into another process. A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process. If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes. The 32-bit and 64-bit DLLs must have different names. 

А вы пытаетесь передать туды свой HANDLE exe файла... 

Ладно опиши(есть не много времени):
  - При установки hook's вы должны иметь привелигии администратора.
  Одним из главных вопросов, на который нужно ответить, это в каком контексте будет выполнен callback который передается в SetWindowsHookEx.
Он будет работать в контексте процесса, который вызвал событие, которое перелавливает SetWindowsHookEx. Это связано с несколькими проблемами:
  - Планировка задач(процессов, потоком) , так как передать сообщения в процесс который установил SetWindowsHookEx будет проблемотично .. 
  - Память, окружения - придется делать сериализоватор\десириализатор ..
  - Привелигии - Если процесс генерирует сообщения с понижиными привелигиями то он будет отправлять сообщения процессу с повышиными привилегиями , что нарушит защиту .. 
  
Вам нужно создать динамическую библиотеку (DLL) которая должна содержать это callback. 

Ссылки на примеры
http://stackoverflow.com/questions/454477/global-hook-setwindowshookex
http://stackoverflow.com/questions/820804/how-to-hook-external-process-with-setwindowshookex-and-wh-keyboard
http://www.codeproject.com/KB/system/hooksys.aspx
http://www.codeproject.com/KB/DLL/keyboardhook.aspx

Автор: User008 29.10.2010, 15:09
Цитата(icecrashldr @  29.10.2010,  11:49 Найти цитируемый пост)
Ладно опиши(есть не много времени):  - При установки hook's вы должны иметь привелигии администратора.  Одним из главных вопросов, на который нужно ответить, это в каком контексте будет выполнен callback который передается в SetWindowsHookEx.Он будет работать в контексте процесса, который вызвал событие, которое перелавливает SetWindowsHookEx. Это связано с несколькими проблемами:  - Планировка задач(процессов, потоком) , так как передать сообщения в процесс который установил SetWindowsHookEx будет проблемотично ..   - Память, окружения - придется делать сериализоватор\десириализатор ..  - Привелигии - Если процесс генерирует сообщения с понижиными привелигиями то он будет отправлять сообщения процессу с повышиными привилегиями , что нарушит защиту ..   Вам нужно создать динамическую библиотеку (DLL) которая должна содержать это callback. 

Всё оказалось намного проще, третий параметр должен быть 0, а четвёртый GetCurrentThreadID(). DLL и привилегии не нужны.

Добавлено @ 15:22
Вообще зря я SetWindowsHookEx взял. Оказывается мне нужен был SetWindowsHook.

Автор: icecrashldr 29.10.2010, 16:10
User008, Это на Windows XP привилегии не нужны .. 

А Где вы нашли SetWindowHook?
http://msdn.microsoft.com/en-us/library/ff468842%28v=VS.85%29.aspx
Это все функты от Microsoft Hook Functions
    * CallMsgFilter
    * CallNextHookEx
    * CallWndProc
    * CallWndRetProc
    * CBTProc
    * DebugProc
    * ForegroundIdleProc
    * GetMsgProc
    * JournalPlaybackProc
    * JournalRecordProc
    * KeyboardProc
    * LowLevelKeyboardProc
    * LowLevelMouseProc
    * MessageProc
    * MouseProc
    * SetWindowsHookEx
    * ShellProc
    * SysMsgProc
    * UnhookWindowsHookEx

Автор: User008 29.10.2010, 18:45
Цитата(icecrashldr @  29.10.2010,  16:10 Найти цитируемый пост)
А Где вы нашли SetWindowHook?

Он существует, хотя пишут, что он устарел.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)