首页 > 其他分享 >MFC的SendMessage与PostMessage的区别

MFC的SendMessage与PostMessage的区别

时间:2024-10-31 20:20:08浏览次数:7  
标签:PostMessage MFC CString LPCTSTR SendMessage 消息 CMFCTESTDlg

一、SendMessage
同步操作: SendMessage 是一个同步函数,它会将消息发送到指定的窗口,并等待该窗口的消息处理过程完成,然后返回。这意味着它会阻塞当前线程,直到消息处理完成。

直接调用: SendMessage 会将消息直接传递给目标窗口的消息处理函数,因此消息处理函数在当前线程中执行。这可以确保消息的有序处理,但也可能导致界面冻结,如果消息处理耗时较长。

用途: 通常用于在同一应用程序内的不同窗口之间传递消息,或者用于发送和接收系统消息

二、PostMessage

异步操作: PostMessage 是一个异步函数,它会将消息放入目标窗口的消息队列中,然后立即返回。它不会等待消息处理完成。

间接调用: PostMessage 不会立即调用目标窗口的消息处理函数。消息会在目标窗口的消息队列中排队,等待目标窗口的消息循环来处理。这意味着消息处理是在目标窗口的线程上执行的。

用途: 通常用于在不同线程之间传递消息,以避免界面冻结或执行长时间运行的任务。

PostMessage是非阻塞的,直接把消息放到消息队列之中,发送函数继续执行,若是发送的参数是临时变量,将会在消息处理函数产生乱码,所以才有静态,或者全局变量避免乱码


#define TTMSG_WARNLIST1 9999
BEGIN_MESSAGE_MAP(CMFCTESTDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CMFCTESTDlg::OnBnClickedButton1)
	ON_MESSAGE(TTMSG_WARNLIST1, &CMFCTESTDlg::OnTTwarnListMsg1)
	ON_BN_CLICKED(IDC_BUTTON2, &CMFCTESTDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CMFCTESTDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CMFCTESTDlg::OnBnClickedButton4)
END_MESSAGE_MAP()





void CMFCTESTDlg::OnBnClickedButton3()
{
	CString str1 = _T("123");
	CString str2 = _T("hello");

	::SendMessage(this->GetSafeHwnd(), TTMSG_WARNLIST1, (WPARAM)(LPCTSTR)str1, (LPARAM)(LPCTSTR)str2); //发送消息方式1
	int m=0;
	m++;

}


void CMFCTESTDlg::OnBnClickedButton2()
{
	CString str1 = _T("123");
	CString str2 = _T("hello");

	::PostMessage(this->GetSafeHwnd(), TTMSG_WARNLIST1, (WPARAM)(LPCTSTR)str1, (LPARAM)(LPCTSTR)str2); //发送消息方式1
	int m=0;
	m++;
	// SendMessage(TTMSG_WARNLIST1, (WPARAM)(LPCTSTR)str1, (LPARAM)(LPCTSTR)str2);     //发送消息方式2
}

LRESULT  CMFCTESTDlg::OnTTwarnListMsg1(WPARAM wParam, LPARAM lParam)
{
	int mm = wParam;
	CString cstr1 = (LPCTSTR)wParam;
	CString cstr2 = (LPCTSTR)lParam;
	m_ctrlEdit.SetWindowText(cstr1+cstr2);
	return TRUE;
}


在这里插入图片描述
以上乱码,将传递参数改成全局或者静态,确保函数推出后不会回收内存即可。
参考:https://blog.csdn.net/sinat_31608641/article/details/106684808

标签:PostMessage,MFC,CString,LPCTSTR,SendMessage,消息,CMFCTESTDlg
From: https://blog.csdn.net/doubleintfloat/article/details/143311225

相关文章

  • 小智桌面遭遇mfc100u.dll加载失败?解决小智桌面因mfc100u.dll缺失导致的加载问题
    在使用小智桌面这款高效、便捷的桌面管理软件时,用户可能会遇到这样一个问题:XZDesktop64.exe在尝试加载mfc100u.dll文件时失败了。这通常意味着系统中缺少了mfc100u.dll这一关键的系统文件,导致小智桌面无法正常运行。本文将详细介绍mfc100u.dll文件的重要性、丢失原因以及多种解......
  • 《女妖的支配者》游戏黑屏?mfc42d.dll文件丢失的修复秘籍
    mfc42d.dll是MicrosoftFoundationClasses(MFC)库的一个动态链接库文件,通常用于开发Windows应用程序。如果你在运行《女妖的支配者》(或其他任何程序)时遇到mfc42d.dll文件丢失的错误提示,你可以尝试以下几种方法来解决问题:1、重新安装游戏或应用程序:有时,问题可能是由......
  • 《星球大战绝地:幸存者》游戏启动时未响应弹窗“找不到mfc110u.dll”文件该怎么解决?星
    《星球大战绝地:幸存者》以其精彩的剧情和刺激的战斗吸引着众多玩家。然而,启动游戏时若出现未响应且弹窗提示“找不到mfc110u.dll”文件,着实令人苦恼。遇到这种情况该如何解决呢?本篇将为大家带来《星球大战绝地:幸存者》游戏启动时未响应弹窗“找不到mfc110u.dll”文件该怎么解决......
  • 计算机基础知识:mfc140u.dll无法继续执行代码
    1.mfc140u.dll简介1.1定义与作用mfc140u.dll是MicrosoftFoundationClasses(MFC)库中的一个动态链接库文件,它是MFC库在Unicode版本中的一个特定实现。MFC是微软为Windows平台开发的一套C++类库,封装了众多WindowsAPI函数,简化了Windows应用程序的开发过......
  • mfc100u.dll丢失找不到,win10电脑mfc100u.dll缺失的解决方法
    Mfc100u.dll是MicrosoftVisualStudio2010的一个重要动态链接库文件,主要用于支持基于MicrosoftFoundationClasses(MFC)的应用程序运行。当在Windows10系统中遇到“找不到Mfc100u.dll”或“Mfc100u.dll丢失”等错误提示时,意味着某些应用程序可能无法正常启动或运行。本文......
  • 轻松解决DLL问题:修复缺失或损坏的mfc42d.dll文件
    修复缺失或损坏的mfc42d.dll文件,可以通过以下几种方法来解决:一、更新或重装VisualC++环境mfc42d.dll文件是Microsoft基础类库(MFC)的一部分,通常随VisualC++发布。因此,下载并安装最新的MicrosoftVisualC++Redistributable包可能会修复缺失或损坏的DLL文件。具体步骤如下:......
  • 一种使用setdll+HOOK钩子技术+dll为MFC程序ProtocalTool等老旧程序打补丁的思路(含源
    一、引言由于工作原因,需要使用一个很老旧的软件,没有源代码,该软件在XP系统下运行正常,但是需要登录,且在win10系统下使用时IP控件运行不正常,只能输入每个数字只能输入2位数,还有一些其他问题,比如给软件添加一些编辑框,或者对软件进行下面简单梳理一下解决这些问题的思路。二、......
  • 火狐浏览器mfc140u.dll缺失引发的故障及高效恢复步骤
    火狐浏览器在运行时如果提示mfc140u.dll文件缺失,可能会引发程序启动失败、运行时异常或崩溃等故障。这个DLL文件是MicrosoftVisualC++RedistributablePackagesforVisualStudio2015的一部分,它包含了运行使用VisualStudio2015开发的C++应用程序所必需的MFC(MicrosoftFo......
  • MFC 之获取文件路径和文件目录路径
    这篇文章我们来介绍一个界面程序中常见的功能,那就是通过点击按钮打开文件浏览对话框,选择对应的文件或者文件夹后,获取其路径,并在编辑中显示出来,当然也会顺带讲一下如果获取当前可执行文件的路径和目录。一、获取文件路径首先我们从工具栏中拖拽一个编辑框和按钮控件到主对话框中,......
  • MFC 之 Progress Control 控件的使用
    提到ProgressControl控件,大家可能会觉得在UI界面里面装一个进度条控件,一下就会让UI界面变得高级了些,所以可能会认为这个控件可能比较难搞。其实恰恰相反,这个控件使用起来特别容易,调用方法也就寥寥几个。不过本文重点内容并不是讲ProgressControl的使用,而是会重点介绍一......