MFC中使用PostMessage和SendMessage函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中使用PostMessage和SendMessage函数相关的知识,希望对你有一定的参考价值。
MFC中,我在使用PostMessage和SendMessage函数时,如果是在Win7下运行的话是正常的,在XP下就出错了,是什么原因啊??
求高手啊,5月13号今天下午毕设要实物检查了,问题是机房里电脑全是XP的,喵喵的,只能带笔记本去糊弄一下了
糊弄过去了,嘿嘿,不过还是想知道解决的办法,求高手啊~~
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;
你问题中的“在此”没有明确是何含义,不好回答。 参考技术A 将消息投递到消息队列,然后立即返回。 参考技术B 这是工作者线程,它的工作想通过窗口来显示,采用调用窗口函数的方法来显示信息是低效的,所以用发消息的方法,比较高效.
PostMessage就是向窗口发消息,通知窗口显示信息.本回答被提问者采纳
以上是关于MFC中使用PostMessage和SendMessage函数的主要内容,如果未能解决你的问题,请参考以下文章