新手 hook的学习

时间:2023-01-05 11:20:58
小弟,今天突然新水来潮,于是在网上没头没脑的看了一通,但是还是不太明白,需要请个高手给小弟讲讲(讲解一下用法),最好有个简单的例子.

13 个解决方案

#1


估计讲的,还不入网上的
多看看,想想,用用就完了

#2


哎..小弟却是有点笨,看了看不懂,想了,想不明白..

#3


#include "stdafx.h"
#include "winceKBhook.h"

//globals
HINSTANCE  g_hHookApiDLL = NULL; //handle to coredll.dll, where all the hook related APIs are present
HHOOK g_hInstalledLLKBDhook = NULL; //g_hInstalledLLKBDhook represents handle to the installed KB hook

/** 
* Function Name:ActivateKBHook
*
* Function Desc:Initializes the proc. adress of various hook related APIs.
*   Loads the keyboard hook.
*
* Parameters:
*  HINSTANCE hInstance : handle to the application to be hooked
*  HOOKPROC LLKeyboardHookCallbackFunction : procedure where the control will come to after any KB event.
* Returns:
*  true if we get all the proc addresses of hook related APIs and load the hook succesfully
*  false if any of the above fails
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)
{
//we need to manually load these standard Win32 API calls
//MSDN states that these aren't supported in WinCE
SetWindowsHookEx = NULL;
CallNextHookEx = NULL;
UnhookWindowsHookEx = NULL;

//now load the coredll.dll
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
if(g_hHookApiDLL == NULL) 
{
//something is awfully wrong
//the dll has to be present
return false;
}
else
{
//load the SetWindowsHookEx API call
//the SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. 
//You would install a hook procedure to monitor the system for certain types of events.
//here we use use the hook to monitor kyeboard events
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
if(SetWindowsHookEx == NULL)
{
//this means that MS has really stopped supporting this API in WinCE
return false;
}
else
{
//install the KB hook
//the hande needs to be saved for default processing of the events and to uninstall the hook, once we are done with it
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, hInstance, 0);
if(g_hInstalledLLKBDhook == NULL)
{
return false;
}
}

//load CallNextHookEx() API call
//the CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. 
//we use this call for default processing of events.
CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
if(CallNextHookEx == NULL)
{
return false;
}

//load UnhookWindowsHookEx() API
//the UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
//we use this call to unistall the hook.
UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
if(UnhookWindowsHookEx == NULL) 
{
return false;
}
}

//all the APIs are loaded and the application is hooked
return true;
}

/** 
* Function Name:DeactivateKBHook
*
* Function Desc:Uninstall the KB hook
*
* Parameters:
*  none
* Returns:
*  true if we exit gracefully
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL DeactivateKBHook()
{
//unload the hook
if(g_hInstalledLLKBDhook != NULL)
{
UnhookWindowsHookEx(g_hInstalledLLKBDhook);
g_hInstalledLLKBDhook = NULL;
}

//unload the coredll.dll
if(g_hHookApiDLL != NULL)
{
FreeLibrary(g_hHookApiDLL);
g_hHookApiDLL = NULL;
}

//we have terminated gracefully
return true;
}


















#ifndef _WINCE_KB_HOOK_H
#define _WINCE_KB_HOOK_H

//used for passing to SetWindowsHookEx funtion to set a Low level (LL) keyboard hook
#define WH_KEYBOARD_LL    20

// Define the function types used by hooks
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK  (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);


// For the low level keyboard hook, your keyboards procedures is passed a pointer to KBDLLHOOKSTRUCT instance
typedef struct {
    DWORD vkCode;
    DWORD scanCode;
    DWORD flags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;


// Win32 Hook APIs 
static _SetWindowsHookExW  SetWindowsHookEx;
static _UnhookWindowsHookEx UnhookWindowsHookEx;
static _CallNextHookEx   CallNextHookEx;


/** 
* Function Name:ActivateKBHook
*
* Function Desc:Initializes the proc. adress of various hook related APIs.
*   Loads the keyboard hook.
*
* Parameters:
*  HINSTANCE hInstance : handle to the application to be hooked
*  HOOKPROC LLKeyboardHookCallbackFunction : procedure where the control will come to after any KB event.
* Returns:
*  true if we get all the proc addresses of hook related APIs and load the hook succesfully
*  false if any of the above fails
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction);

/** 
* Function Name:DeactivateKBHook
*
* Function Desc:Uninstall the KB hook
*
* Parameters:
*  none
* Returns:
*  true if we exit gracefully
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL DeactivateKBHook();



#endif

#4


???

#5


呵呵!好久没见过C++的代码了!

#6


3 楼 是在对不起..我要的是C# 的代码.

而且最好有注释....新手务怪

#7


LZ对Windows的消息机制了解的怎么样?
要想用HOOK的话,这个需要知道
因为HOOK的就是Windows的消息,不了解它的机制,就无从下手

#8


c#实现不了
你可以把那个代码作成dll
然后c# dllimport就可以

#9


我对 windows消息机制 一点都不了解..

希望各位大哥 帮忙..给我讲讲..


to 楼上的 c# dllimport  我也不太谅解...^_^

#10


----------------------------------
自己 UP ...

求C# 对键盘的记录...简单例子
---------------------------------

#12


先下一个WIN32API看看

#13


托管的貌似没法搞。。。
楼主先不要学Hook了,推荐你两本书,第一本《Windows程序设计》第二本《Windows核心编程》
其他两本书对你来说可以从本质上给你提高《深入浅出MFC》和《VCL架构剖析》
貌似程序员不太应该局限于语言,语言只是个载体而已,思路才是最重要的
注:感觉语言中C++确实最难搞定,宏展开简直是噩梦,再加上那不争气的VC编译器(什么乱七八糟的错误信息)

#1


估计讲的,还不入网上的
多看看,想想,用用就完了

#2


哎..小弟却是有点笨,看了看不懂,想了,想不明白..

#3


#include "stdafx.h"
#include "winceKBhook.h"

//globals
HINSTANCE  g_hHookApiDLL = NULL; //handle to coredll.dll, where all the hook related APIs are present
HHOOK g_hInstalledLLKBDhook = NULL; //g_hInstalledLLKBDhook represents handle to the installed KB hook

/** 
* Function Name:ActivateKBHook
*
* Function Desc:Initializes the proc. adress of various hook related APIs.
*   Loads the keyboard hook.
*
* Parameters:
*  HINSTANCE hInstance : handle to the application to be hooked
*  HOOKPROC LLKeyboardHookCallbackFunction : procedure where the control will come to after any KB event.
* Returns:
*  true if we get all the proc addresses of hook related APIs and load the hook succesfully
*  false if any of the above fails
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)
{
//we need to manually load these standard Win32 API calls
//MSDN states that these aren't supported in WinCE
SetWindowsHookEx = NULL;
CallNextHookEx = NULL;
UnhookWindowsHookEx = NULL;

//now load the coredll.dll
g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
if(g_hHookApiDLL == NULL) 
{
//something is awfully wrong
//the dll has to be present
return false;
}
else
{
//load the SetWindowsHookEx API call
//the SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. 
//You would install a hook procedure to monitor the system for certain types of events.
//here we use use the hook to monitor kyeboard events
SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
if(SetWindowsHookEx == NULL)
{
//this means that MS has really stopped supporting this API in WinCE
return false;
}
else
{
//install the KB hook
//the hande needs to be saved for default processing of the events and to uninstall the hook, once we are done with it
g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, hInstance, 0);
if(g_hInstalledLLKBDhook == NULL)
{
return false;
}
}

//load CallNextHookEx() API call
//the CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. 
//we use this call for default processing of events.
CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
if(CallNextHookEx == NULL)
{
return false;
}

//load UnhookWindowsHookEx() API
//the UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
//we use this call to unistall the hook.
UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
if(UnhookWindowsHookEx == NULL) 
{
return false;
}
}

//all the APIs are loaded and the application is hooked
return true;
}

/** 
* Function Name:DeactivateKBHook
*
* Function Desc:Uninstall the KB hook
*
* Parameters:
*  none
* Returns:
*  true if we exit gracefully
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL DeactivateKBHook()
{
//unload the hook
if(g_hInstalledLLKBDhook != NULL)
{
UnhookWindowsHookEx(g_hInstalledLLKBDhook);
g_hInstalledLLKBDhook = NULL;
}

//unload the coredll.dll
if(g_hHookApiDLL != NULL)
{
FreeLibrary(g_hHookApiDLL);
g_hHookApiDLL = NULL;
}

//we have terminated gracefully
return true;
}


















#ifndef _WINCE_KB_HOOK_H
#define _WINCE_KB_HOOK_H

//used for passing to SetWindowsHookEx funtion to set a Low level (LL) keyboard hook
#define WH_KEYBOARD_LL    20

// Define the function types used by hooks
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef HHOOK  (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);


// For the low level keyboard hook, your keyboards procedures is passed a pointer to KBDLLHOOKSTRUCT instance
typedef struct {
    DWORD vkCode;
    DWORD scanCode;
    DWORD flags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;


// Win32 Hook APIs 
static _SetWindowsHookExW  SetWindowsHookEx;
static _UnhookWindowsHookEx UnhookWindowsHookEx;
static _CallNextHookEx   CallNextHookEx;


/** 
* Function Name:ActivateKBHook
*
* Function Desc:Initializes the proc. adress of various hook related APIs.
*   Loads the keyboard hook.
*
* Parameters:
*  HINSTANCE hInstance : handle to the application to be hooked
*  HOOKPROC LLKeyboardHookCallbackFunction : procedure where the control will come to after any KB event.
* Returns:
*  true if we get all the proc addresses of hook related APIs and load the hook succesfully
*  false if any of the above fails
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction);

/** 
* Function Name:DeactivateKBHook
*
* Function Desc:Uninstall the KB hook
*
* Parameters:
*  none
* Returns:
*  true if we exit gracefully
*
* Author:  Prathamesh Kulkarni
**/
WINCEKBHOOK_API BOOL DeactivateKBHook();



#endif

#4


???

#5


呵呵!好久没见过C++的代码了!

#6


3 楼 是在对不起..我要的是C# 的代码.

而且最好有注释....新手务怪

#7


LZ对Windows的消息机制了解的怎么样?
要想用HOOK的话,这个需要知道
因为HOOK的就是Windows的消息,不了解它的机制,就无从下手

#8


c#实现不了
你可以把那个代码作成dll
然后c# dllimport就可以

#9


我对 windows消息机制 一点都不了解..

希望各位大哥 帮忙..给我讲讲..


to 楼上的 c# dllimport  我也不太谅解...^_^

#10


----------------------------------
自己 UP ...

求C# 对键盘的记录...简单例子
---------------------------------

#11


#12


先下一个WIN32API看看

#13


托管的貌似没法搞。。。
楼主先不要学Hook了,推荐你两本书,第一本《Windows程序设计》第二本《Windows核心编程》
其他两本书对你来说可以从本质上给你提高《深入浅出MFC》和《VCL架构剖析》
貌似程序员不太应该局限于语言,语言只是个载体而已,思路才是最重要的
注:感觉语言中C++确实最难搞定,宏展开简直是噩梦,再加上那不争气的VC编译器(什么乱七八糟的错误信息)