关于c#中的消息处理函数和vc中的消息处理函数区别

记录一次在PowerShell下进入VC编译环境的探索过程 前言 为了实现 gitlab CI 自动化构建功能,需要用到 gitlab-runner,在 windows + vc 的场景下需要用到 gitlab-runner for windows。其最终原理是在 powershell 环境下执行 powershell 脚本。 众所周知,大部分通过命令行编译VC项目的过程都需要先初始化VC的工作环境(用cmake构建的除外),通常是通过开始菜单中的 “... 阅读详情

 从vc入门编程的,相信大家都很熟悉PreTranslateMessage和WindowProc两个函数,前者是预处理windows发给控件的消息,后者是处理剩余的控件消息。对于PreTranslateMessage函数,一般来说,我们是这样处理控件消息的:


BOOL test::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->hwnd==GetSafeHwnd())
{

if(pMsg->message==WM_MOUSEMOVE)
{m_tooltip.RelayEvent(pMsg);}
}
 return CDialog::PreTranslateMessage(pMsg);
}
}

分为两层,先判断该消息是属于那个控件窗口的,再判断这个消息的类型。

对于windowproc函数,我们通常是这样处理控件消息的:
LRESULT test::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_SYSCOMMAND)
if(wParam==SC_RESTORE)
wParam=SC_MAXIMIZE;

 return CDialog::WindowProc(message, wParam, lParam);
}
这个函数对控件消息的处理方法是先把消息发给当前控件,如果不处理,则发给其父窗口,如果其父窗口也不处理,则发给当前程序处理。

而在c#中,消息处理函数有所改变。对于PreProcessMessage函数:
我们必须在需要预处理消息的控件中重载这个函数,而不能仅在父窗口重载这个函数。
  public override bool PreProcessMessage(ref Message msg)
  { 
  
   if(msg.Msg==0x101)
   {
  
   
    MessageBox.Show(msg.HWnd.ToString());
   }
   

   return base.PreProcessMessage(ref msg);
  
  }
可以看到,此函数第一步不再需要判断此消息是属于那个控件的,每个控件(包括父窗口本身),它只处理属于自己的消息,不再沿用vc中的消息机制,在某个消息发送到一个类前,允许其它类试着处理它。

 对于WndProc(跟vc中的windowproc名字稍有改变)函数来说:


 protected override void WndProc(ref Message msg)
        {
          
   if(msg.Msg==0x101)
   {
  
   
    MessageBox.Show(msg.HWnd.ToString());
   }
   
            base.WndProc(ref msg);
        }

和vc中的windowproc没有什么形式上的变化,只不过实质上,c#已不再采用消息发送顺序的机制,只要当前控件没有相应消息处理入口,则消息被丢弃。


   如果我们在c#里面想再实现在listbox控件中,点右键弹出菜单,就不能再用
BOOL test::PreTranslateMessage(MSG* pMsg)
{
 if(pMsg->hwnd==GetDlgItem(IDC_listbox1)->GetSafeHwnd())
 {
switch(pMsg->message)
 {

  case WM_LBUTTONUP:
……

  }
 } 
}
呵呵,那怎么办呢,^_^
其实c#中,不再和vc那样只提供少数几种事件,c#中丰富的事件,已经不再经常需要程序员特制某种事件的消息处理函数,只要在listbox控件的mousedown响应函数中,区分出左右键,然后根据情况弹出不同的菜单即可!

    但比如你要自定义一个编辑框,可是想拦截某些特定的键(如delete),这时,c#丰富的事件,就不再有用了,必须要我们先自定义一个从textbox继承下来编辑框控件,然后在其preprocessmessage函数中预处理它!

public override bool PreProcessMessage(ref Message msg)
  { 
  Keys keyCode=(Keys)(int)msg.WParam &Keys.KeyCode;
   if(msg.Msg==0x101&&keyCode==Keys.Delete)
   {
  
  ……
   }
   

   return base.PreProcessMessage(ref msg);
  
  }

剩余几点,我现在还没搞清楚:
PreProcessMessage函数能处理的消息很有限:
WM_KEYUP,WM_KEYDOWN之类的消息可以处理,可是WM_CLOSE,WM_LBUTTONDOWN等消息无法处理。但wndproc函数却可以处理它们! 不知道是微软故意屏蔽掉那些消息的预处理,还是有什么其它的蹊跷!

从零构建个人知识库:Obsidian与Git实践打造可生长的第二大脑 在信息爆炸的时代,如何有效管理个人知识资产,构建一个可检索、可关联、可生长的个人知识库,成为提升学习效率创造力的关键。其核心原理在于通过系统化的信息架构与工作流设计,将碎片化信息转化为结构化的知识网络。从技术价值看,这不仅是笔记方法的升级,更是个人知识管理(PKM)思维模式的革新,能有效对抗信息过载与知识孤岛。实践中,以Obsidian为代表的本地Markdown笔记软件,结合双向链接关系图谱功能,为知识网络的构建提供了强大支撑;而引入Git进行版本控制,则确保了知识资产的历史可追溯性与安全备份。这种 阅读详情

相关推荐

一文吃透 SAP HANA JSON Document Store:从架构到实战的完整指南

本文详细介绍了SAP HANA的JSON Document Store功能,包括其定位、架构、典型场景以及具体使用方法。文章首先分析了半结构化数据场景下传统关系模型的局限性,说明Document Store如何通过集合(Collection)存储JSON文档来提供灵活性。随后详细阐述了启用方式、SQL语法、与Column Store的联动机制,并提供了大量可直接复用的实战案例。特别强调了Document Store作为HANA内建服务的优势,包括企业级一致性、备份恢复等能力。最后给出了数据类型处理跨引擎协

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 173

c#中的消息处理函数vc中的消息处理函数区别

c#

u011555996的博客 756

Ablation 2_pytorch_GaN_医学图像python_医学图像重建_

python 医学图像重建 GAN MAPNN pytorch实现

C#消息处理(转)

C#消息处理方法一、在C#中使用SendMessage      SendMessage是一个在user32.dll中声明的API函数,在C#中导入如下:using System.Runtime.InteropServices;[DllImport("user32.dll", EntryPoint="SendMessageA")]public static exter

liuyuehui的专栏 3128

C# Winform中WndProc 函数作用

WndProc:主要用在拦截并处理系统消息自定义消息 例如 Winform程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息。这个函数就是默认的消息处理函数。你可以重载这个函数来制定自己的消息处理流程。 在Winform程序中,可以重写WndProc函数,来捕捉所有发生的窗口消息。 这样,我们就可以"篡改"传入的消息,而人为的让窗口改变行为。 案例代码: public partial class Form1 : Form { public const in

樱花的博客 5183

C#Process进程的使用,以及对ProcessInfo中所有的参数详细记录

C#关于Process的使用记录,包括:通过Process进程,执行一些exe后缀的文件(打开高级系统设置,打开任务管理器,打开windows资源管理器,ping某个IP地址,打开txt文件),以及获取输出内容,执行多条指令等。mysql提醒错误提示信息Please use --connect-expired-password option or invoke mysql in interactive的解决方法。

hjl011006的博客 7080

c#中怎么截获按钮消息的几种方法实例验证

C#

u011555996的博客 735

vs2017支持所有版本VC

版权归属: https://blog.csdn.net/halchan chanhal@outlook.com 更多关注: https://github.com/chanhal https://www.zhihu.com/people/chanhal 前言 研究目标:VS2017作为目前最新的IDE,让其支持所有版本的VC编译环境 必要性:报建通依赖的特定版本的AutoCAD作为...

halchan的博客 5万+

VC6.0下设置Unicode编译环境

VC6.0下设置Unicode编译环境 - [C/C++]版权声明:转载时请以超链接形式标明文章原始出处作者信息及本声明http://joshuafan.blogbus.com/logs/13704654.htmlVC++ 6.0支持Unicode编程,但默认的是ANSI,所以开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持UNICODE的应用程序。使用VC++

水上漂的专栏 725

vc6.0编译环境介绍

VC++6.0编译环境介绍 大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解。原因是多方面的。大多数情况下,我们只停留在“使用”它,而不会想去“了解”它。因为它只是一个工具,我们宁可把更多的精力放在C++语言软件设计上。我们习惯于这样一种“模式”:建立一个项目,然后写代码,然后编译,反反复复调试。但是,所谓:“公欲善其事,必先利其器”。如果我们精于VC开发环境,我们是不是能够做得更

guojingguan的专栏 3789

C#消息泵探索(一)

消息泵,又叫消息循环。 消息循环使用一个图形化用户界面下的Microsoft Windows。具有GUI 的Windows 程序是事件驱动的。Windows为每个创建窗口的线程维护一个单独的消息队列。通常只有第一个线程创建窗口。Windows 放置消息每当鼠标活动发生在该线程的窗口上时,每当该窗口具有焦点时键盘活动发生时,以及其他时候,都将进入该队列。进程还可以将消息添加到自己的队列中。为了接受用户输入以及出于其他原因,具有窗口的每个线程必须不断地从其队列中检索消息,并对其采取行动。通过编写一个循环调用

杞人忧天的博客 1311

对在C#中的消息应用的资料收集

给你提供一点:C#中调用Windows API的要点,来自【CSDN - 文档中心】在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话,在C:/Progr

牛牛工作室 870

c语言控件接收键盘消息,.Net WinForm 控件键盘消息处理剖析

在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDialogKey,IsInputKey等等,那么这些方法是如何被组织的,每一个方法的具体含义又是什么哪?Win32的键盘消息又是如何到达控件上的这些方法的,本文将着重阐述这些问题,对.Net WinForm控件的键盘消息处理过程进行剖析。1....

weixin_33641654的博客 515

PreProcessMessage重载

Event Handler for Control Key F2 P: n/a Carmen de Lara hello to all, I found in Internet the following code that is very usefull to me. The code dete...

weixin_30265103的博客 249

C#消息处理机制(事件与委托)

编写过Windows桌面应用程序的人都知道,微软Windows操作系统与应用程序之间的通信绝大部分是基于消息循环机制的。在VC++中,程序使用GetMessage,TranslateMessage,DispatchMessage语句从消息队列中获取消息,转换消息并且将消息分发到目标窗口的过程函数,并由过程函数对不同的Windows消息进行分别处理。 当你将开发平台转向C#的时候,由于C#对消息

hhh1108的专栏 9881

(转)c#消息处理

一、消息概述 Windows下应用程序的执行是通过消息驱动的。消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理。 1 什么是消息(Message) 消息就是通知命令。在.NET框架类库中的System.Windows.Forms命名空间中微软采用面对对象的方式重新定义了Message。新的消息(Message)结构的公共部分属性基...

anivdqdt84098的博客 631

C# 消息处理学习总结

C# 收发处理自定义的WINDOWS消息 http://blog.sina.com.cn/s/blog_45eaa01a01013zbs.html   为了程序启动后自动执行主函数,在Form1_Load中直接执行启动函数,可能造成没有 反应。当然,在Form1_Load中加入较长时间(比如2秒)的定时器,在定时器函数中关闭 定时器(仅需要执行一次),再执行主函数

bcbobo21cn的专栏 2789
下一篇: 同一个类,映射多个窗口
ncucf
博客等级 码龄23年 6粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值