如何使对话框中接收到WM_CHAR消息(Windows编程)

WM_KEYDOWN --> 调用TranslateMessage --> WM_CHAR --> WM_KEYUP 分析WM_CHAR 应用程序中键盘消息从WM_KEYFIRST到WM_KEYLAST那么多,但我们知道最原始的键盘消息只有两个那就是WM_KEYDOWN,WM_KEYUP,在键盘钩子中我们能截获的也就这两个消息,那其它消息是从何产生的,如何动作的呢?下面我们就WM_CHAR消息来分析一下。一个键按下后,便会有一个或多个WM_KEYDOWN消息产生,这些消息会从系统消息队列发送到目标窗口的线程的 阅读详情

   我们大家都知道,对话框是有的时候捕获不到WM_CHAR消息的.比如,你想使对话框里的Edit控件所键入的全部变为大写.我们毫不犹豫的写到:
 
 #include
//Declare the Dialog Procedure
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(
 HINSTANCE hInstance,  // handle to current instance
 HINSTANCE hPrevInstance,  // handle to previous instance
 LPSTR lpCmdLine,      // pointer to command line
 int nCmdShow          // show state of window
)
{
    int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc, 0);
 return(ret != IDOK);
}

BOOL CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
  ){ 
 HWND hWndEdit;
 switch (uMsg) {
 case WM_INITDIALOG:
  //Get a handle to the edit control
  hWndEdit = GetDlgItem(hwndDlg, IDC_EDIT1);
  return TRUE;

break;
 case WM_CHAR:
  wParam=toupper(wParam);
  break;
 case WM_COMMAND:
  switch(LOWORD(wParam)){
  case IDOK:
  case IDCANCEL:
   //Close the dialog
   EndDialog(hwndDlg, LOWORD(wParam));
  }
  return TRUE;
 }
 return
FALSE;
}
很遗憾,我敢肯定地告诉你你将会失败,为什么,问题就是出在WM_CHAR上,你可以试一试,当你不把光标移动到Edit控件时,对话框可以捕获到
WM_CHAR消息,但是一旦你把光标移动到Edit控件时,就捕获不到WM_CHAR了.

出现了这种情况,有什么方法可以捕获到WM_CHAR呢?我想对于MFC编程,小Case了,只需重载PreTranslateMessage.
可是对于Windows编程,利用API来写有点麻烦,这里我提供2种方法来达到变为大写的目的.
1)捕获WM_CHAR消息,在这里其实不是对话框真正的捕获WMC_CHAR.多话不说,还是提供代码吧,大家自己去看.

#include
//Declare the Dialog Procedure
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK NewEditProc(HWND, UINT, WPARAM, LPARAM);

//Define a gloabal var
WNDPROC g_Edit;
int WINAPI WinMain(
 HINSTANCE hInstance,  // handle to current instance
 HINSTANCE hPrevInstance,  // handle to previous instance
 LPSTR lpCmdLine,      // pointer to command line
 int nCmdShow          // show state of window
)
{
    int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc, 0);
    return(ret != IDOK);
}

BOOL CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
  ){ 
 HWND hWndEdit;
 switch (uMsg) {
 case WM_INITDIALOG:
  hWndEdit = GetDlgItem(hwndDlg, IDC_EDIT1);
  //Subclass the Edit control
  g_Edit = (WNDPROC)SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG)NewEditProc);
  return TRUE;
  
 case WM_COMMAND:
  switch(LOWORD(wParam)){
  case IDOK:
  case IDCANCEL:
   EndDialog(hwndDlg, LOWORD(wParam));
  }
  return TRUE;
 }
 return FALSE;
}

LRESULT CALLBACK NewEditProc (HWND hwnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
 TCHAR chCharCode;
 switch (message)
 {
 case WM_CHAR:
  wParam=toupper(wParam);
  break;
 }
 return CallWindowProc (g_Edit, hwnd, message, wParam, lParam);
}

2)第二种方法有点土了,不过达到目的就是好方法.还是提供原代码吧.


#include
//Declare the Dialog Procedure
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(
 HINSTANCE hInstance,  // handle to current instance
 HINSTANCE hPrevInstance,  // handle to previous instance
 LPSTR lpCmdLine,      // pointer to command line
 int nCmdShow          // show state of window
)
{
    int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc, 0);
    return(ret != IDOK);
}

BOOL CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
  ){ 
 HWND hWndEdit;
 switch (uMsg) {
 case WM_INITDIALOG:
  hWndEdit = GetDlgItem(hwndDlg, IDC_EDIT1);
  return TRUE;
  
 case WM_COMMAND:
  switch(LOWORD(wParam)){
  case IDC_EDIT1:
  if(HIWORD(wParam)==EN_CHANGE)
  {
   TCHAR szString[100]={0};
   GetDlgItemText(hwndDlg,IDC_EDIT1,szString,99);
   int nLen=0;
   int index=0;
   nLen=lstrlen(szString);
   for(index=0;index   {
    if(szString[index]<='z'&&szString[index]>='a')
    {
     szString[index]-=32;
    }
   }
         szString[nLen]=0;
 
      SendMessage(GetDlgItem(hwndDlg,IDC_EDIT1),WM_SETTEXT,(WPARAM)0,(LPARAM)(LPCSTR)szString);
         SendMessage(GetDlgItem(hwndDlg,IDC_EDIT1),EM_SETSEL,lstrlen(szString),lstrlen(szString));
         }
    break;
  case IDOK:
  case IDCANCEL:
   EndDialog(hwndDlg, LOWORD(wParam));
  }
  return TRUE;
 }
 return FALSE;
}

以上均在VC6.0上通过

别再傻傻分不清了!Windows消息处理中WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN到底怎么用? 本文深入解析Windows消息处理中WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN的区别与应用场景,帮助开发者精准处理键盘输入。通过实战案例和代码示例,详细说明各类消息的触发条件、处理优先级及典型问题解决方案,提升开发效率。 阅读详情

相关推荐

windows程序设计——WM_消息

WM_消息 何时产生 WM_CREATE 当WinMain函数在处理CreateWindow函数时,会发送一个WM_CREATE消息到消息队列。 WM_DISPLAYCHANGE 当显示器的分辨率改变后发送此消息给所有的窗口 WM_VSCROLL 当窗口的标准垂直滚动条中有滚动的事件发生时,在我们的窗口应

IT菜鸟在成长 的专栏 840

子类化实现DialogBox中Edit控件的WM_CHAR消息

这两天用Win32SDK重新实现一次MyWowToc,目的就是实践一下SDK编程的学习成果,这下严重体会到了在GUI方面Delphi对Win32的封装技术真是太强大了,为啥子现在才学SDK呢,主要为了后面搞DDK相关的东东。接着说主题吧,MyWowToc主要就是为 模仿wowtoc1.41,模仿就得像点吧,人家在Interface Version文本框中是不能输入除数字外的其它字符的,虽然将EDI

狂人山庄 3170

WM消息

WM_NULL=$0000;  WM_CREATE=$0001; 应用程序创建一个窗口 WM_DESTROY=$0002; 一个窗口被销毁 WM_MOVE=$0003; 移动一个窗口 WM_SIZE=$0005; 改变一个窗口的大小 WM_ACTIVATE=$0006; 一个窗口被激活或失去激活状态; WM_SETFOCUS=$0007; 获得焦点后 WM_KILLFOCUS=$00

ShaelLancelot的专栏 1623

VC实现 拨号连接及动态IP地址获取

在Win32 API 函数中有一组用于实现远程连接服务RAS 的函数,利用这些函数通过编程可以实现建立和Internet 的拨号连接,并可获得Internet 分配给主机的动态IP 地址。 一、建立拨号连接API   建立拨号连接是利用函数RasDial() 实现的,该函数调用后立即返回,若成功返回0 值,否则返回非0 值。在拨号连接过程中,回调函数接收连接的状态信息及发生的错误代码。

jiangqin115的专栏 1963

Window 消息大全

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows单元中是这样声明的: type TMsg = packed record hwnd: HWND; //窗口句柄 message: UINT;//消息常量标识符 wParam: WPARAM ;// 32位消息的特定附加信息 lParam: LPARAM ;// 32位消息的特定附加信息 time: DWORD;//消息创建时的时间 pt: TPoint; //消息创建时的鼠标位置 end ; 消息中有什么? 是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可 视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也 可以是自定义的常量。 wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。 WM_NULL =$0000 // WM_CREATE =$0001 //应用程序创建一个窗口 WM_DESTROY = $0002 //一个窗口被销毁 WM_MOVE = $0003 //移动一个窗口 WM_SIZE= $0005 //改变一个窗口的大小 WM_ACTIVATE= $0006 //一个窗口被激活或失去激活状态; WM_SETFOCUS= $0007 //获得焦点后 WM_KILLFOCUS= $0008 //失去焦点 WM_ENABLE= $000A //改变enable状态 WM_SETREDRAW= $000B //设置窗口是否能重画 WM_SETTEXT= $000C //应用程序发送此消息来设置一个窗口的文本 WM_GETTEXT = $000D //应用程序发送此消息来复制对应窗口的文本到缓冲区 WM_GETTEXTLENGTH = $000E //得到与一个窗口有关的文本的长度(不包含空字符) WM_PAINT = $000F //要求一个窗口重画自己 WM_CLOSE = $0010 //当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION= $0011 //当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT= $0012 //用来结束程序运行或当程序调用postquitmessage函数 WM_QUERYOPEN = $0013 //当用户窗口恢复以前的大小位置时,把此消息发送给某个图标 WM_ERASEBKGND = $0014 //当窗口背景必须被擦除时(例在窗口改变大小时) WM_SYSCOLORCHANGE = $0015 //当系统颜色改变时,发送此消息给所有顶级窗口 WM_ENDSESSION = $0016 // 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束 WM_SYSTEMERROR = $0017 // WM_SHOWWINDOW= $0018 //当隐藏或显示窗口是发送此消息给这个窗口 WM_ACTIVATEAPP = $001C //发此消息给应用程序哪个窗口是激活的,哪个是非激活的; WM_FONTCHANGE= $001D //当系统的字体资源库变化时发送此消息给所有顶级窗口 WM_TIMECHANGE= $001E //当系统的时间变化时发送此消息给所有顶级窗口 WM_CANCELMODE= $001F //发送此消息来取消某种正在进行的摸态(操作) WM_SETCURSOR = $0020 //如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口 WM_MOUSEACTIVATE = $0021 //当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口 WM_CHILDACTIVATE = $0022 //发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小 WM_QUEUESYNC= $0023 //此消息由基

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 321

WM_GETDLGCODE message

WM_GETDLGCODE message Sent to the window procedure associated with a control. By default, the system handles all keyboard input to the control; the system interprets certain types of keyboard input as dialog box navigation keys. To override this defaul.

weixin_49107487的博客 655

多智能体强化学习论文——SEAC(NIPS 2020)

存在的问题&研究动机&研究思路 在稀疏奖励的环境下,多智能体的exploration存在效率不足等问题。 在IAC的基础上尝试加入重要性采样,使得每次更新智能体iii的参数时,不再仅仅使用智能体iii的数据,而是使用所有智能体的数据进行智能体iii数据的更新。 对于原始的IAC算法是on-policy的,而SEAC则是off-poligy的。 创新点 在每个智能体iii的actoriactor_iactori​和criticicritic_icritici​的更新过程中,都加入了重要性

我的AI笔记 1207

WM_SETFOCUS和WM_KILLFOCUS、WM_GETDLGCODE

    procedure WMSetFocus (var Message: TWMSetFocus); message WM_SETFOCUS; //获得焦点 procedure WMKillFocus (var Message: TWMKillFocus); message WM_KILLFOCUS; //失去焦点   procedure WMGetDlgCode (var Mess...

weixin_34292287的博客 1240

Python爬虫实战:利用最新技术爬取微信公众号文章(基于搜狗搜索)

使用最新Python版本确保兼容性和性能:比传统Requests更强大的HTML解析库Playwright:新一代浏览器自动化工具,比Selenium更高效Asyncio:异步IO框架提升爬虫效率Redis:分布式任务队列和去重MongoDB:非关系型数据库存储结构化数据本文详细介绍了如何利用Python最新技术栈构建一个功能强大的微信公众号文章爬虫。通过结合Playwright浏览器自动化、异步IO、分布式任务队列等技术,我们实现了一个能够绕过反爬机制、高效稳定抓取数据的解决方案。

2201_76125261的博客 1796

使用ClickHouse JDBC官方驱动,踩坑无数

这个问题我在网上查原因说是由于Zookeeper压力过大,表变成只读状态,导致ClickHouse插入数据失败。写入数据频率过高。Zookeeper中的集群节点挂掉。而我们项目出现这个问题的原因是第一个:写入数据频率过高。但是在网上搜资料的过程中,我又发现了另外一个问题:我们项目用了JDBC驱动,但ClickHouse官方并不推荐。。证实了官网确实不建议使用驱动:而应该改成驱动,并且推荐使用0.3.2以上的版本:于是,后面几天开始了ClickHouse的JDBC驱动升级之旅。

2万+

WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息

窗口以击键消息和字符消息的形式接收键盘输入。附加到窗口的消息循环必须包含将击键消息转换为相应字符消息的代码。如果窗口在其客户区显示键盘输入,它应该创建并显示一个插入符号以指示将输入下一个字符的位置。 当用户在键盘上键入时,具有键盘焦点的窗口的窗口过程接收按键消息。击键消息是WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP。典型的窗口过程会忽略除WM_KEYDOWN之外的所有按键消息。当用户按下某个键时,系统会发布WM_KEYDOWN消息。 WM_KEYDOWN:

顺其自然~专栏 6268

基于知识图谱的时空事件关联推理能力培养

随着信息技术的飞速发展,大量的时空事件数据被产生和收集,如交通流量数据、气象观测数据、社交媒体上的地理定位信息等。这些数据蕴含着丰富的知识和规律,但要从中提取有价值的信息并非易事。基于知识图谱的时空事件关联推理旨在通过构建知识图谱,将时空事件数据进行整合和关联,从而实现对事件之间潜在关系的挖掘和推理。本文的目的是系统地介绍基于知识图谱的时空事件关联推理能力的培养方法,包括核心概念、算法原理、数学模型、实际应用等方面。

操作系统内核探秘的博客 750

wm_char消息处理

static LRESULT CALLBACK inputControlManager_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){switch (message)       {       /**************************************************

HGE学习进行中 4022

3. NVIDIA GPU Xid 常见错误码全解析、故障定位与标准化处理方案

摘要: Xid是NVIDIA显卡驱动记录的硬件/软件异常日志,通过dmesg等工具可获取,包含PCI总线、GPU编号、故障码等信息,是诊断显卡问题的核心依据。Xid故障分为四类:应用程序类(如代码错误,Xid13/31)、显存ECC硬件类(如显存损坏,Xid48/63)、链路/供电温控类(如PCIe故障,Xid74/79)和GSP固件类(如静电干扰,Xid119/154)。排查流程包括日志采集、软件修复(如重启进程、升级驱动)、硬件检查(如PCIe链路状态)及断电复位(针对GSP故障)。预防措施包括监控EC

jundao1997的专栏 702

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

键盘消息WM_KEYDOWN/WM_KEYUP、WM_SYSKEYDOWN/WM_SYSKEYUP与字符消息WM_CHAR的区别

一、 WM_*KEY*与WM_CHAR区别1.WM_*KEY* 消息(WM_KEYDOWN/WM_KEYUP、WM_SYSKEYDOWN/WM_SYSKEYUP)是描述键盘虚拟键码的,它对应的是键盘物理按键。2.WM_CHAR 则是描述字符码的,它对应的键盘操作所按下的字符。这二者之间的映射关系在不同物理键盘设备下并不固定,所以Windows封装了TranslateMessage这个API来完成物理键到字符的转换。二、WM_SYSKEY*与WM_KEY*区别WM_SYSKEY*消息由两种情况产生:1.F10

winlly的专栏 4913

【第三方互联】12、支付宝(Alipay)授权第三方登录

我们创建了支付宝开放平台的网页&移动应用,审核通过后,我们需要拿到appid,支付宝公钥,私钥进项开发 一、添加应用信息至项目环境中 我们保存了 appid、应用私钥、支付宝公钥、支付宝回调地址等信息,这里的公钥为支付宝开放平台为我们生成的“支付宝公钥” 二、引入 Maven 依赖 <!-- 支付宝SDK --> <dependency> <g.........

JACKAL 21万+

WM_CHAR与WM_KEYDOWN的区别

//与WM_KEYDOWN消息不同的是,WM_CHAR消息是俘获某一个字符的消息,WM_KEYDOWN消息是俘获某一个键按下的消息 //假如分别按下“q”和“shift+q”,发出的WM_KEYDOWN消息都是代表q键,而发出的WM_CHAR消息分别是“q”和“Q” //mfc程序,在view类里添加WM_CHAR消息的响应函数OnChar() //nChar代表某个字符,用*来表示 //程序

gou_zh的专栏 1267

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

【转】详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息

转自:http://blog.sina.com.cn/s/blog_4b3c1f950100nten.html Windows消息的分类 1.标准消息(队列消息) 除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR。 从CWnd派生的类都可以接收到这类消息。 Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它...

sinolover的专栏 2227

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

从WM_KEYDOWN到WM_CHAR:Windows键盘消息的转换与处理逻辑

本文深入解析Windows键盘消息处理机制,重点探讨WM_KEYDOWN到WM_CHAR的转换逻辑。通过对比击键消息(WM_KEYDOWN/WM_SYSKEYDOWN)与字符消息(WM_CHAR)的区别,揭示系统如何处理物理按键到可显示字符的转换过程,并提供实际开发中的处理技巧与常见问题解决方案。

weixin_30892763的博客 175

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WM_CHAR消息与WM_KEYDOWN消息

各个评论的汇总: 1. WM_CHAR消息只响应字符按键和部分控制符 (有很多控制字符不响应 不响应的键如下: Tab键///Caps Lock大小写切换键//ESC键///F1~F12///SHIFT///CTRL///ALT///方向键///方向键上方键盘区///Num Lock键) WM_KEYDOWN响兴所有按键消息(Alt键///Print Screen SysRq

qq_16334327的博客 5467
上一篇: 如何把你的应用程序作为服务来运行(1)
下一篇: 分析类的法则
confach
博客等级 码龄23年 2粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值