MFC中使用PostMessage和SendMessage函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中使用PostMessage和SendMessage函数相关的知识,希望对你有一定的参考价值。

MFC中,我在使用PostMessage和SendMessage函数时,如果是在Win7下运行的话是正常的,在XP下就出错了,是什么原因啊??
求高手啊,5月13号今天下午毕设要实物检查了,问题是机房里电脑全是XP的,喵喵的,只能带笔记本去糊弄一下了

糊弄过去了,嘿嘿,不过还是想知道解决的办法,求高手啊~~

在MFC中使用PostMessage和SendMessage函数:

BOOL PostThreadMessage( UINT message , WPARAM wParam, LPARAM lParam );
Called to post a user-defined message to another CWinThread object
使用这个函数可以向一个CwinThread类型的类发送消息(即包括从CWindThrea中继承而来的类),使用方法如下:
CWinThread *pUIThread = AfxBeginThread(RUNTIME_CLASS(CProgress));//CProgress是从CWindThead中继承而来的类
CProgress *pUIThrd = (CProgress *)(pView->pUIThread); //pView是一个视类的实例,pUIThread是它的一个成员
pUIThrd->PostThreadMessage(WM_PROS,NULL,NULL); //向CProgress类发送WM_PROS消息,由该类中对应的消息响应函数进行处理

BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
Places a message in the window's message queue and then returns without waiting for the corresponding window to process the message
使用这个函数可以向一个CWnd类型的类发送你消息(即包括从CWnd类中继承而来的类),CView也是从中继承而来的,使用方法如下:
CWinThread *pThread = AfxBeginThread(Calculate,this); //this代表的是一个从CView类中继承而来的Demo4View类,Caculate是该线程的
//线程处理函数,把this传递给Caculate进行处理
CDemo4View *pView = (CDemo4View *)pParam;
pView->PostMessage(WM_RESULT,NULL,duration); //向这个CDemo4View类发送WM_RESULT消息,由该类对应的消息响应函数进行处理

LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
它与PostMessage的用法相同个,不同支持是它只有在对应的类处理完发送的消息后才返回,这样后面的代码可能要过一段时间才能执行;
而PostMessge是发送完消息就立即返回,不管消息处理完没有,这样后面的代码就可以立即执行。
参考技术A WIN7的API版本进行了优化,比xp更智能,我原来也遇到过类似的在win7下没问题在xp下就有问题的。不过要是有问题的话还是代码哪里有毛病,调试下看看吧。追问

调试的时候,PostMessage和SendMessage函数对应的消息函数正常运行了,但运行结束后,会连续提醒三次"内存不能为"read"",这是怎么回事啊

追答

应该是指针越界的问题,你仔细检查一下指针的使用情况。

追问

指针,你是指窗口指针吗,我只在SendMessage中用了一次,这样应该不算越界吧
我把对应的消息函数中全部注释掉,加了个AfxMessageBox,当AfxMessageBox执行后才会出现错误的

追答

你看看你调用sendMessage之前的一些操作,一步步走,看看是不是都对。

追问

我把SendMessage的语句注释掉之后,运行是正常的,没出现错误,不注释可以跟进去的,我用AfxMessageBox放在SendMessage语句之后(整个SendMessage之后就这一句代码)可以出现,再之后就出现错误了,如果我在SendMessage语句之后放两个AfxMessageBox,在这两个之间放CDialog::OnCancel();第二个AfxMessageBox不会运行了~~这里算是什么错误啊??

追答

把你sendmessage的前后代码都发上来一下。

本回答被提问者采纳
参考技术B 如果你只想向TextBox里写点东西的话WM_CHAR消息或直接SendKeys.Send就行了
private const int WM_CHAR = 0x0102;
private void button1_Click(object sender, EventArgs e)

textBox1.Focus();
SendMessage(this.textBox1.Handle, WM_CHAR, 65, 0);
SendKeys.Send("A");

参考技术C Win7不兼容MFC追问

我是编好的程序分别在XP 和Win7下运行的

追答

那不知道了

请问MFC中PostMessage()在此有啥作用呢?

我是一个初学都,想请教一个在下面的线程代码中,PostMessage这个有什么作用呢?谢谢啊!!
UINT TreadProc(LPVOID param)


CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp();
CMainFrame *pMainFrame = (CMainFrame *)pApp->GetMainWnd();
CThreadTestView *pView = (CThreadTestView *) pMainFrame->GetActiveView();
pView->m_strMessage = “启动了一个线程” ;
while(threadController)

::Sleep(1000);
::PostMessage((HWND)param, WM_THREAD_SENDMESS, 0, 0);

pView->m_iTime =0;
pView->m_strMessage = “线程结束”;
return 0;

PostMessage是用来向窗口发送消息的,以便通知指定窗口需要做出相应的动作,与SendMessage不同的是,PostMessage并不保证消息已经发给了指定窗口,而SendMessage能保证消息发送成功。

你问题中的“在此”没有明确是何含义,不好回答。
参考技术A 将消息投递到消息队列,然后立即返回。 参考技术B 这是工作者线程,它的工作想通过窗口来显示,采用调用窗口函数的方法来显示信息是低效的,所以用发消息的方法,比较高效.

PostMessage就是向窗口发消息,通知窗口显示信息.本回答被提问者采纳

以上是关于MFC中使用PostMessage和SendMessage函数的主要内容,如果未能解决你的问题,请参考以下文章

请问MFC中PostMessage()在此有啥作用呢?

MFC PostMessage SendMessage

MFC发送自定义消息-PostMessage和SendMessage

接收 MFC 对话框的 PostMessage 消息

MFC中的SendMessage和PostMessage

MFC中的SendMessage和PostMessage