在dll中SendMessage(HWND_BROADCAST,MSG_R,NULL,NULL);在调用它的程序中要怎么获得MSG_R消息??????
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?




