浅谈windows 编程中SendMessage函数的妙用!!!

C# 下sendmessage和postmessage的区别详解与示例 SendMessage和PostMessage都是用于窗口消息传递的方法,但它们在使用方式和功能上存在一些差异。SendMessage是直接发送消息,而PostMessage是将消息放入队列中,稍后发送。在实际应用中,可以根据需求选择合适的 method。 阅读详情

windows编程中SendMessage函数是非常重要的,而且这个对于理解windows的消息机制也很重要。本文用代码的方式实现了一些功能,借以说明此函数之妙用。说明不当之处,希望批评指正,谢谢!

废话不多说了,代码说明了一切!!!


/*本程序主要为了演示SendMessage的用法,
*实现功能:
* --> 1: 完全去掉窗口标题栏和边框。
* --> 2: 在窗口客户区按住鼠标左键可以拖动窗口。
* --> 3: 每隔2秒变换一次窗口背景颜色。
* --> 4: 屏蔽Alt + F4组合键的关闭窗口功能。
* --> 5: 在窗口客户区双击鼠标左键,让窗口最大化。
* --> 6: 按钮实现的最大化窗口,最小化窗口,关闭窗口。
* 
*/


// 本程序在vs2012调试通过,保存文件时用cpp文件,用c++的方式编译。
#include<Windows.h>
#define ID_TIMER      1
#define WM_CHANGECOLOR (WM_USER + 1) // 自定义消息

#define ID_COLOR      0
#define ID_MINIMIZE   1
#define ID_MAXIMIZE   2
#define ID_RESTORE    3
#define ID_FULLSCREEN 4
#define ID_CLOSE      5



LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstace,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hInstance = hInstace;
	wndclass.lpfnWndProc = WndProc;
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = TEXT("sunkang");

	RegisterClass(&wndclass);
	HWND hwnd = CreateWindow(TEXT("sunkang"),TEXT(""),WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstace,NULL);
	ShowWindow(hwnd,SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	MSG msg;

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static int cxClient,cyClient;
	static int cxScreen,cyScreen;
	static int btn_width,btn_height;
	static HBRUSH hBrush[5];
	static HWND hButton[6];
	static int indicator = 0; // 对应为红色
	switch(message)
	{
	case WM_CREATE:
		{
		//得到应用程序实例句柄
		HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
		COLORREF color[5] = {RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),RGB(0,0,0),RGB(100,100,100)};
		TCHAR* title[6] = {TEXT("变换颜色"),TEXT("最小化"),TEXT("最大化"),
			TEXT("复位"),TEXT("全屏"),TEXT("关闭窗口")};
		for(int i = 0; i < 5; ++i)
			hBrush[i] = CreateSolidBrush(color[i]); // 创建画刷
		for(int i = 0; i < 6; ++i)
			hButton[i] = CreateWindow(TEXT("button"),title[i],WS_CHILDWINDOW | WS_VISIBLE | BS_DEFPUSHBUTTON,
			0,0,0,0,hwnd,HMENU(i),hInstance,NULL);
		SetTimer(hwnd,ID_TIMER,2000,0);  // 时间间隔为2秒
		cxScreen = GetSystemMetrics(SM_CXSCREEN); //静态变量
		cyScreen = GetSystemMetrics(SM_CYSCREEN); //静态变量
		SendMessage(hwnd,WM_CHANGECOLOR,0,0); // 改变一下背景颜色
		break;
		}
	case WM_SIZE:
		{
		cxClient = LOWORD(lParam); //静态变量
		cyClient = HIWORD(lParam); 
		btn_width = cxClient / 6; //静态变量
		btn_height = cyClient / 5; 
		for(int i = 0; i < 6; ++i) //依次设定button的位置
			MoveWindow(hButton[i],i * btn_width,0,btn_width,btn_height,TRUE);
		
		//具体看WM_CHANGECOLOR消息的实现
		break;
		}
	case WM_LBUTTONDOWN:
		{
		SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
		break;
		}
	case WM_LBUTTONDBLCLK:
		{
		// 最大化窗口
			SendMessage(hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,lParam);
		break;
		}
	case WM_TIMER:
		{
        //按照设定,时间间隔为2秒
	    // 模拟鼠标的键击,点击"变换颜色"按钮
			SendMessage(GetDlgItem(hwnd,ID_COLOR),WM_LBUTTONDOWN,wParam,
				MAKELONG(btn_width / 2,btn_height / 2)); // 左键按下
			SendMessage(GetDlgItem(hwnd,ID_COLOR),WM_LBUTTONUP,wParam,
				MAKELONG(btn_width / 2,btn_height / 2)); // 左键释放
			// 键击位置为button中心
			// 可以看到每隔2秒窗口背景颜色会变换一次
		break;
		}
	case WM_CHANGECOLOR:
		{
			indicator = indicator == 4 ? 0 : indicator + 1;
			SetClassLong(hwnd,GCL_HBRBACKGROUND,LONG(hBrush[indicator]));
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);
			break;
		}
	case WM_COMMAND:
		{
		    switch(LOWORD(wParam))
		    {
			case ID_COLOR:
				SendMessage(hwnd,WM_CHANGECOLOR,wParam,lParam);
				break;
			case ID_MINIMIZE:
				SendMessage(hwnd,WM_SYSCOMMAND,SC_MINIMIZE,lParam);
				break;
			case ID_MAXIMIZE:
				SendMessage(hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,lParam);
				break;
			case ID_RESTORE:
				//下面这条语句要加上,不然会有点问题,这与windows内部保存的状态有关。
				SendMessage(hwnd,WM_SYSCOMMAND,SC_RESTORE,lParam);
				MoveWindow(hwnd,cxScreen / 8,cyScreen / 8,cxScreen * 3 / 4,
					cyScreen * 3 / 4,TRUE);
				break;
			case ID_FULLSCREEN:
				//下面这条语句要加上,不然会有点问题,这与windows内部保存的状态有关。
				SendMessage(hwnd,WM_SYSCOMMAND,SC_RESTORE,lParam);
				MoveWindow(hwnd,0,0,cxScreen,cyScreen,TRUE);
				break;
			case ID_CLOSE:
				SendMessage(hwnd,WM_CLOSE,wParam,lParam);
				break;
			default:
				break;
		    }
		SetFocus(hwnd); // 将焦点设为父窗口
		break;
		}
	case WM_CLOSE:
		{
		if(IDOK == MessageBox(hwnd,TEXT("确定退出吗?"),TEXT("关闭窗口"),MB_OKCANCEL | MB_ICONQUESTION))
			SendMessage(hwnd,WM_DESTROY,wParam,lParam);
		//当然也可以直接调用DestroyWindow(hwnd);
		break;
		}
	case WM_DESTROY:
		{
		KillTimer(hwnd,ID_TIMER);
		for(int i = 0; i < 5; ++i) //释放资源
			DeleteObject(hBrush[i]);
		PostQuitMessage(0);
		break;
		}
	case WM_NCCALCSIZE:
		{ //完全去掉标题栏和边框
			break;
		}
	case WM_SYSKEYDOWN:
		{
		if(GetKeyState(VK_F4) < 0) // 屏蔽Alt + F4 的关闭窗口功能
			break;
		else
			return DefWindowProc(hwnd,message,wParam,lParam);
		}
	default:
		return DefWindowProc(hwnd,message,wParam,lParam);
	}
	return 0;
}






全屏效果的图片如下:




SendMessage函数使用指南及推荐代码 函数是Windows编程中一个用于发送消息的API,它允许一个窗口进程将消息直接传递给另一个窗口,确保消息立即被处理。它是同步消息传递机制的核心组成部分,在需要确保消息处理立即发生且顺序执行的情况下非常有用。Winsock控件是Windows平台上网络编程的关键组件,它封装了复杂的网络通信过程,使得开发者可以更方便地进行网络编程。Winsock控件的主要特点包括:简单易用:基于事件驱动,通过简单的属性设置、事件处理及方法调用即可实现网络通信。协议支持。 阅读详情

相关推荐

帆软js--获取控件和单元格

参数面板: 获取面板控件 ,name为控件名称:_g().parameterEl.getWidgetByName("name") 取值:_g().parameterEl.getWidgetByName("tt3").getValue()2323 赋值:_g().parameterEl.getWidgetByName("tt2").setValue("987") 调用对应的事件比...

江湖行骗老中医 7197

SendMessage 用法详解及消息详解

函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。 函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam); 参数: hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口

顺其自然~专栏 9186

XVF3800麦克风阵列实战:从选型到快速原型搭建

本文详细介绍了XVF3800麦克风阵列的选型与快速原型搭建实战经验。从开箱即用的特性到波束成形、回声消除等核心功能拆解,再到硬件设计避坑指南和固件开发技巧,帮助开发者高效实现智能语音设备的开发。特别适合智能音箱、会议终端等需要远场拾音和声源定位的应用场景。

weixin_29161719的博客 273

SendMessage(PostMessage)详解

Windows API(应用程序接口)是Windows系列软件为程序开发人员提供的火力强大的“武器库”,在这个武器库中,有很多极具威力的武器,SendMessage就是其中之一,它的功能非常丰富,灵活使用这个函数,会给编程工作带来很多便利。本文以Visual Basic为例,结合几个具体的例子介绍该函数的功能。一、SendMeaasge函数简介顾名思义,SendMessage函数的功能是“发送...

weixin_33827731的博客 5769

PX4实战指南:通过遥控器通道映射实现多舵机PWM精准控制

本文详细介绍了通过PX4飞控的AUX PWM接口实现遥控器通道映射控制多舵机的实战指南。内容包括硬件选型与连接、软件参数配置、通道映射方法以及常见问题排查,帮助开发者精准实现无人机舵机PWM控制,适用于云台、机械臂等扩展功能开发。

ee345的博客 304

173、NPU的编译器开发:开源社区贡献指南

本文分享了在NPU编译器开源社区贡献的经验心得。作者通过实际案例(如卷积维度错误、NaN输出等)阐述了NPU编译器开发的特殊性:硬件迭代快、边界条件复杂、厂商代码不可全信。提出有价值的贡献应聚焦硬件适配测试、性能剖析工具和反模式文档三类内容。强调用实测数据沟通、主动承担维护责任、保持代码通用性等社区协作技巧,并建议通过RFC提前沟通、附硬件实测数据等方式提高PR通过率。最后指出,NPU编译器开发是与聪明人共同填坑的过程,鼓励开发者提交"有诚意的代码"而非完美代码。

m0_50546716的博客 35

SendMessage 详解

http://www.cnblogs.com/rosesmall/p/3248244.html 窗体操作;控件;文本;系统操作等等。 笑笑小白 归类自己需要的资料,慢慢爬行 vb sendmessage 详解1 SendMessage函数的常用消息及其应用(有点长,希望能对大家有所帮助) 函数原型: Declare Function S

sunxinyu的专栏 3万+

华为OD机考双机位C卷 - 池化资源共享 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 池化资源共享 (OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 1070

发送消息(SendMessage)常识普及

点击阅读原文现在易论坛很多人都喜欢在“发送消息”等操作时直接用数字,往往又不知道什么数字代表什么意思,也无从查起。比如,有人说16是关闭窗口,那么请问17是什么?绝大部分的人不知道,即使你去问C++高手,也是绝大部分不知道的。当初微软定义这些常量的时候,是为了让这些枯燥的数字更好记忆、阅读,可是现在很多易语言程序员却反其道行之,实在是不好的习惯。我来说一下“发送消息---SendMessage”的...

Missing 1万+

使用R包PreMSIm预测微卫星不稳定的标题:基于基因表达量的微卫星不稳定性预测

在本文中,我们将介绍如何使用R语言中的PreMSIm包来根据基因表达量进行微卫星不稳定性的预测。需要注意的是,本文仅介绍了使用PreMSIm包进行微卫星不稳定性预测的基本流程和代码示例。在实际应用中,还需要考虑数据的质量控制、模型优化以及结果的解释和验证等因素,以确保预测结果的准确性和可靠性。预测结果将返回一个包含微卫星不稳定性指数的向量,其中每个元素对应一个样本的预测结果。在有了输入数据后,我们可以使用PreMSIm包中的函数进行微卫星不稳定性的预测。函数生成一个包含所有样本的微卫星不稳定性信息的表格。

2301_79330511的博客 382

从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践

单 Bot 多 Agent只有一个对外的聊天入口(飞书 Bot)内部有多个独立的 AI Agent,各司其职主 Agent(总指挥)负责接收任务并分配给子 Agent子 Agent 完成任务后将结果返回给主 Agent角色Agent ID职责使用场景🎯 总指挥main-agent统筹协调,任务分发接收所有用户请求✍️ 笔杆子内容创作公众号、博客、小红书🔬 参谋canmou深度研究竞品分析、市场调研📋 运营官operations运营管理邮件、日历、社交媒体。

Maynor的博客 1079

浅谈Sendmessage 和Postmessage

SendMessage函数功能描述:将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回。 Postmessage函数则是将消息放入消息队列里,并立即返回。 PostThreadMessage函数: BOOL PostThreadMessage(DWORD idThread,...

weixin_30617561的博客 85

【FPGA教程案例37】通信案例7——基于FPGA的FFT,IFFT傅里叶变换和逆变换

关于FFT和IFFT的相关描述,在上一课程我们已经有所了解,本课程不再重复。在上一课程,我们初步掌握了如何通过FFT对输入信号进行频谱分析,在本课程,我们将学习如何通过FPGA实现FFT和IFFT得到初始信号的过程。关于FFT的IP核配置,和上一课程相同。下面直接介绍其verilog调用过程。我们可以看到,IFFT的配置非常简单,在FFT的基础上,只需要将该参数的最后一位改为0,就可以实现IFFT变化。下面我们通过testbench文件,同时调用FFT和IFFT实现信号的傅里叶变换和逆变换。......

FPGA/MATLAB学习教程/源码/项目合作开发 4515

Windows进程间各种通信方式浅谈

http://blog.youkuaiyun.com/bjtbjt/article/details/7044266 1 Windows进程间通信的各种方法      进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。   多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接

jiangqin115的专栏 1986

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SendMessage使用方法

(1)向子窗口传递消息: ::SendMessage(m_DlgLeftChild.m_hWnd, MSG_UPDATE_LEFT_CHILD, 0, 0); (2)向父窗口发送消息 CWnd* pWnd = dynamic_cast<CSendMsgDemoDlg*>(GetParent()); HWND hWnd = pWnd->GetSafeHwnd(); ::SendMessage(hWnd, MSG_UPDATE_PARENT, 0, 0); ...

u011269801的专栏 1512

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Windows 窗口发送消息参数详解

窗口发送消息参数详解 // 窗口.发送消息 函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果 中文函数原型: 发送消息(hwnd,msg,wparam,iparam) 英文函数原型: sendmessage(hwnd,msg,wparam,iparam) 参数: hwnd: 窗口句柄 值,可以通过,找到窗口、顶层窗口句柄,等获取句柄的函数得到 msg:指定被发送的消息 wparam:指定附加的消息特定信息。 ip

心流剑的博客 2万+

一处消息死锁分析

windows是一个消息驱动的系统,也是个多任务调度系统,windows中的线程分为两类,GUI线程与Worker线程,每个GUI线程会关联消息队列,当消息处理顺序不当时,则有可能造成消息死锁。 使用VS2008打开项目工程,按F5启动调试,该工具工作正常,点击退出按钮,此时会发现该工具失去了响应。按Ctrl+Alt+Break将程序中断,发现程序停在了如下位置。 可以看出,当接收到退出消

马大叔的工作日记 2720

SendMessage 和 PostMessage 有什么区别?

SendMessage 和 PostMessage 有什么区别?

weixin_46319994的博客 2036

SendMessage和PostMessage发送消息(不同进程传递字符串)

一、函数功能 该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。 二、函数原型 SendMessage函数的原型为 LRESULT SendMessage(   HWND hWnd,   UINT Msg,   WPARAM wParam,

程序道 -Learning, Thinking and Coding <存储知识的金库> 1万+

sendmessage, postmessage, 和 sendnotifymessage函数应用及其区别

sendmessage, postmessage, 和 sendnotifymessage函数应用及其区别,适合入门

qq_46017342的博客 1944

windows 发送消息 投递消息

【代码】windows 发送消息 投递消息。

lljlkjh的博客 449

SendMessage、PostMessage原理

SendMessage、PostMessage原理本文讲解SendMessage、PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级、中级、高级程序员进行理解,三个步骤分别为:1、SendMessage、PostMessage的运行机制。2、SendMessage、PostMessage的运行内幕。3、SendMessage、PostMessage的内部实

胡超的学习日志 5万+

C++ 通过DestroyWindow或SendMessage关闭视窗时候出现问题

目录问题概览一.`DestroyWindow`无法关闭视窗问题1.问题现象2.排查思路3.问题原因及解决办法二.用`SendMessage`关闭多个视窗时,异常中断1.问题现象2.排查思路3.问题原因及解决办法参考引用 问题概览 近期在完成一个连接多台相机,并实时显示每一个相机窗口的程序过程中,在程序的最后会涉及对显示窗口的关闭。但是期间尝试采用DestroyWindow和SendMessage来关闭时都出现了无法关闭或异常中断的问题。详细问题如下 在主线程中使用DestroyWindow无法关闭生成的

weixin_43560489的博客 3246
上一篇: c++ 头文件<cstring>(或者string.h)中的常见函数的实现!
下一篇: c++ 头文件<cwchar>中常见函数的实现!!!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值