VC中动态链接库如何正确同窗口通信?

SY710 2010-03-26 07:14:55
打算用Hook写一个获取键盘输入的小程序,自己写了一个动态链接库来设置全局键盘钩子,函数原型:void SetHook(HWND m_hWnd),在CDialog的initialDialog的函数内调用了这个函数,并且把自己的窗口句柄传给了动态链接库,目的是为了在动态链接库内给这个窗口发消息。我原打算是将这个窗口隐藏,并调用Shell_Notify函数设置托盘图标。结果我的这个窗口收不到动态链接库发的任何消息(包括WM_CLOSE消息),我在调试的时候发现如果不隐藏窗口,即使这个窗口不是激活窗口,动态链接库发送的消息这个窗口时可以收到的,但是一旦这个窗口隐藏了,就收不到动态链接库发送的消息了。后来又想了想,窗口句柄是内核对象,是进程相关的,在不同的进程之间即使窗口句柄值一样,它们对应的东西也不会一样。但是,我用的是动态链接库调用窗口句柄,相当于就是本进程之间的函数间调用,应该不会出现这个问题。调试了半天也没发现原因,希望各位帮帮我,多谢了!
...全文
163 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2010-03-29
  • 打赏
  • 举报
回复
如果是有标题的窗口的话可以每次调用indWindow来查找窗口句柄
mcaok 2010-03-29
  • 打赏
  • 举报
回复
进程间的通信问题,可以用内存映射文件,管道,Socket都可以。用内存映射文件较方便。
dll中

HANDLE hMapping;
LPWSTR lpData;
hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x1000,"MYSHARE");
if(hMapping!=NULL)
{
lpData=(LPWSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData!=NULL)
{
swprintf(lpData,L"%s:%s",iter->second.ObjName,bsTemp.c_str());
//给主窗口g_hMain发送消息
PostMessage(g_hMain,WM_GETMESSAGE,(WPARAM)param,NULL);

}
UnmapViewOfFile(lpData);
}
zyyoung 2010-03-26
  • 打赏
  • 举报
回复
用socket
「已注销」 2010-03-26
  • 打赏
  • 举报
回复
在DLL中你保存的那个m_hWnd 要是共享的 不然你的主窗口收不到消息
oyljerry 2010-03-26
  • 打赏
  • 举报
回复
那就不用消息机制,通过RPC,等进程通信方式

15,471

社区成员

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

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