关于hook(急)

prglib 2002-02-04 05:38:23
我在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;
}
...全文
89 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdj0569 2002-03-05
  • 打赏
  • 举报
回复
在dll中添上一个共享数据段,我觉得是最好的方法
susenfu 2002-03-05
  • 打赏
  • 举报
回复
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;
}


g_hWnd = hWnd; <---------对g_hWnd变量进行内存共享。

方法
1、CreateFileMapping();
2、MapViewOfFile();
3、UnmapViewOfFile();
4、UnmapViewOfFile();
prglib 2002-02-13
  • 打赏
  • 举报
回复
how to give you points?
捕鲸叉 2002-02-09
  • 打赏
  • 举报
回复
gzup
doskey 2002-02-09
  • 打赏
  • 举报
回复
在DLL中加入全局数据段:
#pragma data_seg("ShareData")
HWND hWnd=NULL;//你KBSPY的窗口句柄,等等
HHOOK hhk=NULL;//还要注意,这里的数据必须初始化
#pragma data_seg()
然后按ALT+F7
分别在DEBUG和RELEASE的LINK的最下面加上
/SECTION:ShareData,rws
就可一了。
顺便提一句,我也写了个类似的东东有兴趣我寄给你
arloan 2002-02-09
  • 打赏
  • 举报
回复
钩子函数是由系统调用的,和你的进程不在同一个地址空间,因此钩子里的全局变量在系统那个进程中并没有赋值,肯定都是NULL.
prglib 2002-02-04
  • 打赏
  • 举报
回复
我创建了一个程序:kbspy.exe
还创建了一个kbhooklib.dll
hook procedure就放在了kbhooklib.dll里了.不行为什么呢?
arloan 2002-02-04
  • 打赏
  • 举报
回复
全局钩子必须放在另外一个DLL中
prglib 2002-02-04
  • 打赏
  • 举报
回复
msdn里说键盘的钩子可以挂接成全局的呀!
上次鼠标钩子也是,为什么不能收到别的线程的键盘消息呢?

1,662

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧