DLL封装键盘HOOK如何将捕捉到的消息发送给主程序?

wxu2 2005-03-12 03:50:26
编写了一个EXE和一个简单的全局键盘挂钩DLL,挂钩函数能捕捉到了任何窗口产生的键盘消息,想把所有消息发送到主程序,我在挂钩函数中写了这么一段代码:
//-------
CString str,strkey;

GetWindowText(hMainWindow,str.GetBuffer(str.GetLength()) ,255);//获得窗口标题
strkey.Format("%c",wParam); 将ASCII转换成字符
MessageBox(0,strkey ,str,0);//显示发生按键的所在窗口标题以及按键字符
//-----------

其中hMainWindow主程序窗口句柄是静态变量,在安装挂钩函数中由主程序调用时传递来后设置的。

但是现在的情况是,当鼠标停在主程序窗口上进行按键的时候,MESSAGEBOX函数可以输出窗口标题,但是鼠标移动到主程序窗口外,然后按键后,虽然能输出按键字符,但是窗口标题却为空。

我知道这是因为不在一个进程的缘故,所以除主程序进程之外,其他进程的hMainWindow为0,我现在想知道,如何让所有进程都能获得主窗口句柄!这样我就可以将所有消息POST给主程序了!

PS:我不想在挂钩函数中显示的通过主程序标题获得窗口句柄。

...全文
65 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wxu2 2005-03-12
谢谢二位,我已经搞定了!
我在查阅了很多资料,为了先达到目的,所以先不考虑扩展性,使用了共享内存的方法,我在HOOK.H中加入了以下代码:
#pragma data_seg("KEYSEC")
HWND hMainWindow=0;
#pragma data_seg()

然后在HOOK.DEF中加以下代码:
SECTIONS
KEYSEC READ WRITE SHARED

运行通过!

回复
udmmmm 2005-03-12
可以用WM_COPYDATA;
也可以用sockect编程;此外还有内存共享、mailslot等。推荐用Socket,这样扩展性好。
回复
Kudeet 2005-03-12
RegisterWindowMessage定义消息,他是对整个windows系统注册,就是系统中增加了一个消息。
UINT uret=RegisterWindowMessage("GET_ZWZ_EXE_BOOL");
//返回值就是消息ID可以利用此ID进行消息的处理。

参考:
http://dev.csdn.net/Develop/article/15/15195.shtm
回复
wxu2 2005-03-12
上面打错了,应该为:
MessageBox(0,strkey ,str,0);//显示任何窗口下发生按键时,所在进程获得的主窗口标题以及按键字符
回复
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2005-03-12 03:50
社区公告
暂无公告