关于hook(急)
我在win98下面编译通过,但在运行时只能挂起当前的线程,为什么?
kbspy.exe部分的源代码:
其中WM_KEYRECIEVED是自定义的消息,是KeyboardPro用它把消息发回到主窗口
int CKBSpyDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
//InjectCode will call sethook function
int nRet = InjectCode(GetSafeHwnd());
return nRet;
}
LRESULT CKBSpyDlg::KeyboardMsg(WPARAM wParam, LPARAM lParam)
{
CString temp;
temp.Format("The key pressed is :%c",MapVirtualKey(wParam, 2));
::MessageBox(NULL,LPCTSTR(temp),NULL,MB_OK);
return 0;
}
void CKBSpyDlg::OnClose()
{
EjectCode();
CDialog::OnClose();
}
void CKBSpyDlg::OnOK()
{
EjectCode();
CDialog::OnOK();
}
下面是kbhooklib.dl的源代码:
#include "stdafx.h"
#include "KBHookLib.h"
KBHOOKLIB_API HWND g_hWnd =0;
KBHOOKLIB_API HHOOK g_hHook =0;
KBHOOKLIB_API HINSTANCE g_hModDll =0;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModDll = (HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if(g_hHook)
EjectCode();
break;
}
return TRUE;
}
//Hook procedure will send message to KBSpy
KBHOOKLIB_API LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam )
{
::PostMessage(g_hWnd,WM_KEYRECIEVED,wParam,lParam);
return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}
KBHOOKLIB_API void EjectCode()
{
::UnhookWindowsHookEx(g_hHook);
g_hHook = 0;
}
KBHOOKLIB_API BOOL InjectCode(HWND hWnd)
{
g_hWnd = hWnd;
//Hook up all processes if dwThreadID is assigned to zero
if(g_hHook = ::SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hModDll, 0))
return TRUE;
else
return FALSE;
}