用PostMessage为什么收不到消息?

迪士尼公主 2008-02-27 09:40:27
pWnd->PostMessage(WM_SEARCH, 0, 0);
我用这条语句为什么收不到消息啊?
可以发送成功,可是没有反应。
是不是发过去消息,消息相应函数就会立即起作用了? 需要什么条件吗?
我这样消息定义对吗?

#define WM_SEARCH WM_USER +102
这条定义语句要放到哪里啊?是主窗口还是子窗口? 是.h文件还是.cpp文件?

PostMessage里面的参数0是什么意思?与WM_USER +102里面的102有关系吗?

请各位大侠帮帮忙!特急啊!

...全文
1679 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bianliu1013 2008-02-28
  • 打赏
  • 举报
回复
可以试一试这个,
::PostMessage(hwnd, WM_MYMESSAGE, wParam, lParam);
处理函数 OnMyMessage(WPARAM wParam, LPARAM lParam)
  • 打赏
  • 举报
回复
可能是消息的处理函数没有格式写。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}
  • 打赏
  • 举报
回复
消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。通常的做法是采取以下步骤:

  第一步:定义消息。

  推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

#define WM_MY_MESSAGE (WM_USER+100)

  第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。

LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}

  第三步:在类头文件的AFX_MSG块中说明消息处理函数:

class CMainFrame:public CMDIFrameWnd
{
...
// 一般消息映射函数
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}

  第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
  • 打赏
  • 举报
回复
#define WM_SEARCH WM_USER +102
可以放到stdafx.h中
或者 所有使用WM_SEARCH的所有文件中.

pWnd-> PostMessage(WM_SEARCH, 0, 0);

pWnd必须有WM_SERARCH消息的响应函数 才有反应


shakaqrj 2008-02-28
  • 打赏
  • 举报
回复
你怎么接受的?在哪接受的?
hityct1 2008-02-28
  • 打赏
  • 举报
回复
一般每个子窗口都应建立与之相关联的变量,通过这个变量
获得子窗口的句柄。
jixingzhong 2008-02-28
  • 打赏
  • 举报
回复
CWnd::PostMessage

Places a message in the window's message queue and then returns without waiting for the corresponding window to process the message.

BOOL PostMessage(
UINT message,
WPARAM wParam = 0,
LPARAM lParam = 0
);


Parameters
message
Specifies the message to be posted.

wParam
Specifies additional message information. The content of this parameter depends on the message being posted.

lParam
Specifies additional message information. The content of this parameter depends on the message being posted.

Return Value
Nonzero if the message is posted; otherwise 0.
jixingzhong 2008-02-28
  • 打赏
  • 举报
回复
PostMessage 只发送消息,不等待处理

SendMessage 或许更接近你的要求
菜牛 2008-02-27
  • 打赏
  • 举报
回复
当前子窗口,首先得看你是怎么来切换当前子窗口的,在此过程中当然已经知道了当前子窗口。PostMessage不会等待消息处理完成才返回。既然消息是你自定义的,参数当然也是自定义的,只有你自己知道含义,当然和102没有任何联系。
迪士尼公主 2008-02-27
  • 打赏
  • 举报
回复
补充:
我觉得可能是我获得的句柄不对,我在主窗口里面建了tab control,每个标贴里放一个子窗口,我怎样获得目前现实的子窗口的句柄啊?
以下的代码对不对???

CWnd* pWnd = ChildWindowFromPoint(CPoint(rect.Width()/2, rect.Height()/2),CWP_SKIPTRANSPARENT);

// CWnd* pWnd = FindWindow("RudeNote", NULL);

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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