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

bphantom 2003-10-03 11:03:20
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发过来的消息,怎么办?
...全文
276 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bphantom 2003-10-10
  • 打赏
  • 举报
回复
得到大家的帮助,我终于解决了,答案是:如果用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) 的方法成功解决了问题。
lop5712 2003-10-06
  • 打赏
  • 举报
回复
HWND_BROADCAST只是当前所有窗口中的overlapped窗口才接收得到消息,并不是所有窗口,请检查一下你的Dialog不是popuped而是overlapped的
flyelf 2003-10-06
  • 打赏
  • 举报
回复
调用PostMessage(HWND_BROADCAST,WM_MY_MESSAGE,NULL,NULL);所有注册了wm_my_message的窗口都可以接收到
yafizyh 2003-10-06
  • 打赏
  • 举报
回复
到底是PostMessage(hAim,WM_MY_MESSAGE,NULL,NULL);
还是PostMessage(HWND_BROADCAST,WM_MY_MESSAGE,NULL,NULL);
yafizyh 2003-10-06
  • 打赏
  • 举报
回复
dll可以映社到各个进程中,也就是说,一个DLL有多个实例.每个都在不同的进程中运行.
你是在自己的进程中设置的窗口局柄,这个变量存在于你的进程空间.当DLL被其他进程加载,
窗口句柄变量存在与另一个进程空间,并且未被赋值,所以消息发不过去.解决方法以告诉你了,
将窗口句柄设为所有实例共享的:

#pragma data_seg("Shared")
HWND g_hWnd=NULL;
#pragma data_seg()

#pragma comment(linker,"/SECTION:Shared,RWS")

若还不行,将WM_USER换成WM_APP 试试。
bphantom 2003-10-05
  • 打赏
  • 举报
回复
up
bphantom 2003-10-04
  • 打赏
  • 举报
回复
我在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消息,但不活动时就接收不到了,该怎么办?
bphantom 2003-10-04
  • 打赏
  • 举报
回复
up
wangjs720 2003-10-04
  • 打赏
  • 举报
回复
不用PrcTranslateMessage,用消息映射
wangjs720 2003-10-04
  • 打赏
  • 举报
回复
你你在Dll中定义的消息原样复制到你的程序中,然后添加消息映射各消息处理函数就行了
yafizyh 2003-10-04
  • 打赏
  • 举报
回复
将WM_USER换成WM_APP 试试。另外窗口句柄要设为全局的。方法如下:

#pragma data_seg("Shared")
HWND g_hWnd=NULL;
#pragma data_seg()

#pragma comment(linker,"/SECTION:Shared,RWS")

15,471

社区成员

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

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