CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

在dll中SendMessage(HWND_BROADCAST,MSG_R,NULL,NULL);在调用它的程序中要怎么获得MSG_R消息??????

楼主bphantom(无花无酒)2003-10-03 23:03:20 在 VC/MFC / 进程/线程/DLL 提问

dll中定义了消息  
  #define   MSG_R   WM_USER+120  
  #define   MSG_S   WM_USER+121  
  #define   MSG_T   WM_USER+122  
  #define   MSG_U   WM_USER+123  
  #define   MSG_V   WM_USER+124  
  #define   MSG_W   WM_USER+125  
  #define   MSG_X   WM_USER+126  
  #define   MSG_Y   WM_USER+127  
  然后在键盘按下相应键时:  
  switch(wParam)  
  {  
   
  case   'R':  
  SendMessage(HWND_BROADCAST,MSG_R,NULL,NULL);  
  //AfxMessageBox("send   r   msg");  
  break;  
  case   'S':  
  SendMessage(HWND_BROADCAST,MSG_S,NULL,NULL);  
  break;  
  case   'T':  
  SendMessage(HWND_BROADCAST,MSG_T,NULL,NULL);  
  break;  
  case   'U':  
  SendMessage(HWND_BROADCAST,MSG_U,NULL,NULL);  
  break;  
  case   'V':  
  SendMessage(HWND_BROADCAST,MSG_V,NULL,NULL);  
  break;  
  case   'W':  
  SendMessage(HWND_BROADCAST,MSG_W,NULL,NULL);  
  break;  
  case   'X':  
  SendMessage(HWND_BROADCAST,MSG_X,NULL,NULL);  
  break;  
  case   'Y':  
  SendMessage(HWND_BROADCAST,MSG_Y,NULL,NULL);  
  break;  
  default:  
  break;  
  }  
  在调用此dll的程序中:  
  #define   MSG_R   WM_USER+120  
  #define   MSG_S   WM_USER+121  
  #define   MSG_T   WM_USER+122  
  #define   MSG_U   WM_USER+123  
  #define   MSG_V   WM_USER+124  
  #define   MSG_W   WM_USER+125  
  #define   MSG_X   WM_USER+126  
  #define   MSG_Y   WM_USER+127  
  BOOL   CGetWindowDlg::PreTranslateMessage(MSG*   pMsg)    
  {  
  //   TODO:   Add   your   specialized   code   here   and/or   call   the   base   class  
   
  if   (pMsg->message==MSG_R)  
  {  
  AfxMessageBox("r");  
  }  
  return   CDialog::PreTranslateMessage(pMsg);  
  }  
  日,怎么收不到dll发过来的消息,怎么办? 问题点数:20、回复次数:11Top

1 楼bphantom(无花无酒)回复于 2003-10-04 11:28:35 得分 0

upTop

2 楼yafizyh(亚斐)回复于 2003-10-04 16:21:45 得分 0

将WM_USER换成WM_APP   试试。另外窗口句柄要设为全局的。方法如下:  
   
  #pragma   data_seg("Shared")  
  HWND     g_hWnd=NULL;  
  #pragma   data_seg()  
   
  #pragma   comment(linker,"/SECTION:Shared,RWS")Top

3 楼wangjs720(听雨舟)回复于 2003-10-04 17:35:29 得分 0

你你在Dll中定义的消息原样复制到你的程序中,然后添加消息映射各消息处理函数就行了Top

4 楼wangjs720(听雨舟)回复于 2003-10-04 17:36:03 得分 0

不用PrcTranslateMessage,用消息映射Top

5 楼bphantom(无花无酒)回复于 2003-10-04 23:56:49 得分 0

我在dll中发送消息如下:  
  //#define   WM_MY_MESSAGE   (WM_USER+100)  
  static   UINT   WM_MY_MESSAGE=RegisterWindowMessage("User");  
  PostMessage(hAim,WM_MY_MESSAGE,NULL,NULL);  
  我在调用它的程序中添加消息映射如下:  
  //#define   WM_MY_MESSAGE   (WM_USER+100)    
  static   UINT   WM_MY_MESSAGE=RegisterWindowMessage("User");  
  //ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage)  
  afx_msg   LRESULT   OnMyMessage(WPARAM   wParam,   LPARAM   lParam);  
  ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage)  
  //  
  LRESULT   CGetWindowDlg::OnMyMessage(WPARAM   wParam,   LPARAM   lParam)  
  {  
  AfxMessageBox("i   get   it");  
  return   0;  
  }  
  当调用dll的程序为活动窗口时,就可以接收到来自dll的WM_MY_MESSAGE消息,但不活动时就接收不到了,该怎么办?Top

6 楼bphantom(无花无酒)回复于 2003-10-05 12:20:50 得分 0

upTop

7 楼yafizyh(亚斐)回复于 2003-10-06 13:21:24 得分 0

dll可以映社到各个进程中,也就是说,一个DLL有多个实例.每个都在不同的进程中运行.  
  你是在自己的进程中设置的窗口局柄,这个变量存在于你的进程空间.当DLL被其他进程加载,  
  窗口句柄变量存在与另一个进程空间,并且未被赋值,所以消息发不过去.解决方法以告诉你了,  
  将窗口句柄设为所有实例共享的:  
   
  #pragma   data_seg("Shared")  
  HWND     g_hWnd=NULL;  
  #pragma   data_seg()  
   
  #pragma   comment(linker,"/SECTION:Shared,RWS")  
   
  若还不行,将WM_USER换成WM_APP   试试。  
  Top

8 楼yafizyh(亚斐)回复于 2003-10-06 15:17:09 得分 0

到底是PostMessage(hAim,WM_MY_MESSAGE,NULL,NULL);  
  还是PostMessage(HWND_BROADCAST,WM_MY_MESSAGE,NULL,NULL);  
  Top

9 楼flyelf(空谷清音)回复于 2003-10-06 21:28:07 得分 0

调用PostMessage(HWND_BROADCAST,WM_MY_MESSAGE,NULL,NULL);所有注册了wm_my_message的窗口都可以接收到Top

10 楼lop5712(LOP)回复于 2003-10-06 21:44:17 得分 20

HWND_BROADCAST只是当前所有窗口中的overlapped窗口才接收得到消息,并不是所有窗口,请检查一下你的Dialog不是popuped而是overlapped的Top

11 楼bphantom(无花无酒)回复于 2003-10-10 15:43:17 得分 0

得到大家的帮助,我终于解决了,答案是:如果用PostMessage(hAim,WM_MY_MESSAGE,NULL,NULL);当hAim是非活动时,到底是当hAim无法接收还是dll无法发送,我不得而知,但一句话,最终hAim没收到。  
  如果用PostMessage(HWND_BROADCAST,WM_MY_MESSAGE,NULL,NULL);时,只要将Dialog,既我程序中的接收窗口改为verlapped就可以了,就像   lop5712(LOP)所说的,要是verlapped窗口才能接收HWND_BROADCAST方式的消息。  
  我用   lop5712(LOP)   的方法成功解决了问题。Top

相关问题

  • ASSERT(pWnd->m_hWnd == NULL);???????????
  • DLL中用 SendMessage HWND 字符串消息
  • CreateControlEx( lpszName, hWnd, pStream, NULL, NULL, NULL, NULL );中第三个参数怎么设置,才能设置组件的属性?
  • SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER,1); 这句程序有问题么?
  • 我怎么在CMyApp中SendMessage((HWND)(pMyDlg),WM_MYMESSAGE,0,0)?
  • r
  • SendMessage
  • ::SendMessage((HWND)AfxGetMainWnd(),WM_PAINT,0,0);中的 :: 是什么意思? 谢谢!!
  • SendMessage
  • SendMessage?

关键词

  • dll
  • 消息
  • 映射
  • 解决
  • haim
  • wm
  • msg
  • 调用
  • broadcast
  • sendmessage

得分解答快速导航

  • 帖主:bphantom
  • lop5712

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo