孙鑫VC++深入详解:Lesson8 Part3---如何让对话框捕获WM_KEYDOWN消息?

VC6下对话框工程中的键盘按键(WM_KEYDOWN)演示 正常情况下,在对话框工程中无法响应WM_KEYDOWN消息函数,即添加此消息应射之后,程序永远不会进入到这个消息的处理函数中,所以也就无法捕获键盘的按键消息。 上网上搜索了一下,找到了篇: http://tieba.baidu.com/f?kz=136722697 这应该算是一种方法。 在本次上传的演示代码中,没有使用这种方法。 经过实际的程序跟踪发现,对话框工程是可以捕获到这个按键消息,只是没有最终发送到WM_KEYDOWN中而已,但是在分发消息之前就可以看到这个消息。由此,我们在分发消息之前来捕获这个消息就可以了。演示代码中拐了个弯,把这个捕获到的消息,又重新向窗口发送了一次自定义消息,然后在WndProc()函数进行了处理 立即下载


因为对话框程序中,某些特点的消息,如按键消息被Windows内部的对话框过程处理了,即基类完成了或者被发送给子控件处理,所以在对话框类中就不能捕获到按键消息


解决办法:在子类中覆盖基类的特定消息过滤响应函数.

在MFC中,用虚函数ProcessMessageFilter()来过滤或者响应菜单和对话框的特定Windows消息.

在子类中覆盖它,接管消息响应.

本例中,在CWinSunApp类中增加虚函数 ProcessMessageFilter

//覆盖基类的虚函数,接管消息
BOOL CWinSunApp::ProcessMessageFilter(int code, LPMSG lpMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
    
	if(m_hwndDlg!=NULL)
	{
		if(lpMsg->message==WM_KEYDOWN)
			AfxMessageBox("捕获WM_KEYDOWN成功!");
	}
	
	return CWinApp::ProcessMessageFilter(code, lpMsg);
}

WinSunApp.h

// WinSun.h : main header file for the WINSUN application
//

#if !defined(AFX_WINSUN_H__025D80ED_531B_42C3_8C9F_1EB3093C7BC9__INCLUDED_)
#define AFX_WINSUN_H__025D80ED_531B_42C3_8C9F_1EB3093C7BC9__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
	#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"		// main symbols

/////////////////////////////////////////////////////////////////////////////
// CWinSunApp:
// See WinSun.cpp for the implementation of this class
//

class CWinSunApp : public CWinApp
{
public:
	HWND m_hwndDlg;
	CWinSunApp();

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CWinSunApp)
	public:
	virtual BOOL InitInstance();
	virtual BOOL ProcessMessageFilter(int code, LPMSG lpMsg);
	//}}AFX_VIRTUAL

// Implementation

	//{{AFX_MSG(CWinSunApp)
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};


/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_WINSUN_H__025D80ED_531B_42C3_8C9F_1EB3093C7BC9__INCLUDED_)

WinSunApp.cpp

// WinSun.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "WinSun.h"
#include "WinSunDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWinSunApp

BEGIN_MESSAGE_MAP(CWinSunApp, CWinApp)
	//{{AFX_MSG_MAP(CWinSunApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG
	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWinSunApp construction


CWinSunApp::CWinSunApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CWinSunApp object

CWinSunApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CWinSunApp initialization

BOOL CWinSunApp::InitInstance()
{
	AfxEnableControlContainer();

	// Standard initialization
	// If you are not using these features and wish to reduce the size
	//  of your final executable, you should remove from the following
	//  the specific initialization routines you do not need.

#ifdef _AFXDLL
	Enable3dControls();			// Call this when using MFC in a shared DLL
#else
	Enable3dControlsStatic();	// Call this when linking to MFC statically
#endif

	CWinSunDlg dlg;
	m_pMainWnd = &dlg;
	int nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: Place code here to handle when the dialog is	
		//  dismissed with OK
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with Cancel
	}

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.

	//将CWinSunApp类的成员变量设置为NULL
	m_hwndDlg =NULL;

	return FALSE;
}

//覆盖基类的虚函数,接管消息
BOOL CWinSunApp::ProcessMessageFilter(int code, LPMSG lpMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
    
	if(m_hwndDlg!=NULL)
	{
		if(lpMsg->message==WM_KEYDOWN)
			AfxMessageBox("捕获WM_KEYDOWN成功!");
	}
	
	return CWinApp::ProcessMessageFilter(code, lpMsg);
}

WinSunDlg.h

// WinSunDlg.h : header file
//

#if !defined(AFX_WINSUNDLG_H__9DC85391_A9DD_4A1E_8380_6A32A3CF15EF__INCLUDED_)
#define AFX_WINSUNDLG_H__9DC85391_A9DD_4A1E_8380_6A32A3CF15EF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CWinSunDlg dialog

class CWinSunDlg : public CDialog
{
// Construction
public:
	CWinSunDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CWinSunDlg)
	enum { IDD = IDD_WINSUN_DIALOG };
		// NOTE: the ClassWizard will add data members here
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CWinSunDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CWinSunDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnDestroy();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_WINSUNDLG_H__9DC85391_A9DD_4A1E_8380_6A32A3CF15EF__INCLUDED_)

WinSunDlg.cpp

// WinSunDlg.cpp : implementation file
//

#include "stdafx.h"
#include "WinSun.h"
#include "WinSunDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWinSunDlg dialog

CWinSunDlg::CWinSunDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CWinSunDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CWinSunDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CWinSunDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CWinSunDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CWinSunDlg, CDialog)
	//{{AFX_MSG_MAP(CWinSunDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWinSunDlg message handlers

BOOL CWinSunDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

	//将对话框的句柄传递到CWinSunApp类中
	((CWinSunApp*)AfxGetApp())->m_hwndDlg =this->m_hWnd;
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CWinSunDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CWinSunDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CWinSunDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CWinSunDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
      //对话框窗口销毁后,将CWinSumApp类中的变量m_hwndDlg置为NULL
		((CWinSunApp*)AfxGetApp())->m_hwndDlg =NULL;
}

//---

//---


//---编译运行,试着按下键盘任意一个键:

//---

vc6中让EDit响应keydown事件 vc6中让EDit响应keydown事件 源码加操作说明步骤 立即下载

相关推荐

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 794

基于 CDialog 的 MFC 程序无法响应键盘消息

自己写一个继承了 CDialog 的类,然后响应 WM_KEYDOWN 消息,发现无论按什么键都不响应,需要重写 PreTranslateMessage 方法,在这个方法中处理 WM_KEYDOWN,至于原因,网上有很多解释,这里就不展开讨论。这里有一个更简单的方法。因为消息的传递是先从 CWinApp 再到 CDialog,所以可以重写 CWinApp 的 PreTranslateMessage,在这个方法里,将消息发给最前面的窗口就可以了,代码如下。然后对话框的 OnKeyDown 就能响应了。

2502_92636479的博客 222

关于42步进电机驱动——基于STM32 HAL库实现

我找了好多资料,好多关于42步进电机的都是文档,这么文档都需要积分,需要积分就算了内容还非常差,浪费时间和电脑的内存。关于大部分是基于Arduino和51去驱动的 42步进电机驱动硬件如下: 首先你要了解步进电机的驱动原理,我也不啰嗦了,请看这边博客: 二相四线,四相五线,四相六线步进电机接线及驱动方法 , 看完这篇你就知道驱动和接线的原理了。 起初我也为如何接线烦恼,因为有些博客在讲述这些问题的时候没有讲的很透彻。 方法如下: ①用万用表调到欧姆档,用其中一个表笔搭在一个引脚上,依次测其它.

Jodan132的博客 1万+

VC++对话框程序不响应OnChar 和 OnKeyDown事件处理函数

vc++生成的对话框程序默认是不会响应OnChar和OnKeyDown消息的,会被其它控件拦截 如果不修改代码,使用时会发现不会进入这两个事件响应函数,必须修改重写PreTranslateMessage()虚函数才能正确地响应这两个消息函数,具体实现如下: BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { SendMes

blueicescape的专栏 4052

使用 ANSYS 实现铸造、凝固和熔炼的高级解决方案

凭借其强大的有限元分析 (FEA) 和计算流体动力学 (CFD) 功能,ANSYS 可以准确预测模具内的热和流体流动行为。总之,ANSYS 是铸件凝固和熔化领域的关键工具。其全面的仿真功能、工艺优化功能、材料特性分析和用户友好的界面使其成为旨在创新和改进制造工艺的工程师不可或缺的工具。通过利用 ANSYS,各行各业可以在铸造业务中实现更高的质量、效率和成本效益,从而为先进的制造解决方案铺平道路。ANSYS是一款领先的工程仿真软件,提供强大的功能来建模和优化这些复杂的热过程,从而显著提高生产效率和质量。

jkh920184196的博客 2108

天线学习笔记——串馈网络设计

工程中通常更倾向于使用50Ω、70.7Ω、100Ω的固定阻抗的带宽,实际中可以分别使用固定阻抗的带宽和计算得到的带宽进行仿真,观察二者的性能,取性能更优者即可。本系列是一个记录天线设计的笔记,分享出来也希望能够帮助到大家,后续本系列文章还会不定期更新,如有需要可关注,任何问题均可在评论区或私信提出,看到必回。如果对大家有帮助可进行打赏哦~

Ethan的博客 7880

对话框响应WM_KEYDOWN消息

对于按键消息,WM_CHAR 也一样,我敢肯定地告诉你你将会失败,为什么,问题就是出在WM_CHAR上,你可以试一试,当你不把光标移动到Edit控件时,对话框可以捕获到WM_CHAR消息,但是一旦你把光标移动到Edit控件时,就捕获不到WM_CHAR了.        出现了这种情况,有什么方法可以捕获到WM_CHAR呢?我想对于MFC编程,小Case了,只需重载PreTranslateMe

baizhengbiao的专栏 8042

Jetson平台XDMA PCIe驱动安装与测试全指南

本文提供了一份在NVIDIA Jetson平台上安装与测试Xilinx FPGA XDMA PCIe驱动的完整指南。详细阐述了驱动作为高速DMA引擎的核心作用,并逐步讲解了从环境准备、驱动编译、内核模块加载到实际数据传输测试的全过程。内容涵盖常见问题排查与性能优化建议,帮助开发者实现Jetson与FPGA间的高速数据通信,适用于自动驾驶、工业视觉等需要异构计算的应用场景。

weixin_29196315的博客 527

VC处理键盘消息

VC中键盘事件处理主要是通过对相应的消息的响应,这些事件有如:WM_CHAR、WM_KEYDOWN、WM_KEYUP等他们分别对应OnChar、OnKeyDown、OnKeyUp消息处理函数;当然在有些时候我们也可能需要用到对PreTranslateMessage函数的重载。 从这些事件的名称我们可以看出WM_CHAR表示字符事件,WM_KEYDOWN表示键盘的键被按下时事件,而WM_KEYUP

点点滴滴,终汇一海! 1万+

变压器励磁电感、励磁电流、漏感、漏感折算

励磁、漏感知识整理

HW-BASE的博客 1万+

【OpenClaw从入门到精通】第02篇:5分钟速通!阿里云/华为云一键部署OpenClaw(附避坑指南·2026实测版)

本文聚焦OpenClaw的云端部署场景,针对本地部署“关机即离线、跨设备访问难”的痛点,详解阿里云(主推)和华为云(备选)的一键部署流程。2026实测验证:阿里云轻量应用服务器通过官方OpenClaw镜像可5分钟完成部署,华为云Flexus L实例需补充SSH配置步骤;文中拆解云端部署核心概念(地域选择、端口放行、成本构成),通过“AI助理定时抓取行业资讯并推送钉钉”的虚拟案例演示云端7×24小时运行价值,同时提供模型调用、服务器成本的精细化控制方案,梳理端口访问失败、API-Key权限异常等高频坑点的解决

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 5547

VC++对话框的KeyDown问题

我的问题在注释处,谢谢大家 BOOL CMsgKeyDownDlg::PreTranslateMessage(MSG* pMsg)  { HWND   hwnd;    GetDlgItem(IDC_EDIT1,&hwnd);       if(   pMsg->message   ==   WM_KEYDOWN   &&   pMsg->hwnd   ==   hwnd)    {  

qiuniaoyi3810的博客 527

HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真

LVTTL电平为单端信号,而SSTL电平本质上是差分对,其实现机制是将信号与参考电平Vref组成差分对进行比较,如图所示,VIH和VIL各有一个交流参数AC和直流参数DC,信号第一次越过AC门限的时刻,作为时序计算的参考点,此后只要信号保持DC门限内,逻辑状态保持不变,这种设计减小了噪声、振铃等对于信号质量的影响。经过调整后,控制器在发送颗粒1的DQS后,延时1ns再发送颗粒2的DQS,则颗粒1在1ns后收到对齐的DQS和CLK,颗粒2在2ns后收到对齐的DQS和CLK,从而满足了时序关系。

小幽余生不加糖 7677

如何在对话框程序中让对话框捕获WM_KEYDOWN消息

在对话框程序中,我们经常利用对话框上的子程序的子控件进行命令响应处理一些shijian

水墨丹心,无情雨 1608

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

CDialog中不响应OnKeyDown和一些相关问题

第一方案:在网上经常有人提出CDialog中响应键盘消息的OnKeyDown函数没反应。结论是CDialog不响应OnKeyDown,相应的解决方法是: BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMs

menfolk_odon的专栏 2686

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何让对话框响应WM_KEYDOWN消息

重载PreTranslateMessage<br /><br />BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)<br />{<br />         // TODO: Add your specialized code here and/or call the base class<br /><br />         if(pMsg->message == WM_KEYDOWN || pMsg->message == WM_CHAR)<br />     

Blue_LAtom的专栏 761

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

转:孙鑫老师大作 - 在对话框程序中让对话框捕获WM_KEYDOWN消息

在对话框程序中,我们经常是利用对话框上的子控件进行命令响应来处理一些事件。如果我们想要让对话框(子控件的父窗口)类来响应我们的按键消息,我们可以通过ClassWizard对WM_KEYDOWN消息进行响应,当程序运行后,我们按下键盘上的按键,但对话框不会有任何的反应。这是因为在对话框程序中,某些特定的消息,例如按键消息,它们被Windows内部的对话框过程处理了(即在基类中完成了处理,有兴趣的读者

Chinawash 专栏 1788

C++工作笔记-WM_KEYFIRST和WM_KEYDOWN的用法

转载地址如下:http://www.xuebuyuan.com/1544382.html在讲这两个标识符的作用开始,先小感慨下:遇到问题,不要急着百度,请充分利用好VC++的中的各种头文件    在VC中,右击"WM_KEYFIRST"字符,选择“转向WM_KEYFIRST的定义”,VC自动跳转到定义这两个标识符的头文件WINUER.H,代码如下:#define WM_KEYFIRST      ...

IT1995的博客 1万+

[转]MFC学习总结(二)

21. 介绍函数过程中一种任意键退出同时能处理消息的实现方法1. 设置定时器,用于使::GetMessage(...)函数总能快速取到消息.2. 在函数处理中加入:函数每执行完一步后执行下面的代码.if (::GetMessage(&msg, 0, 0, 0)){  if (msg.message >= WM_KEYFIRST && msg.message   ::TranslateMessage

blueblood_jing的专栏 869

孙鑫- VC++在对话框程序中让对话框捕获WM_KEYDOWN消息

在对话框程序中,我们经常是利用对话框上的子控件进行命令响应来处理一些事件。如果我们想要让对话框(子控件的父窗口)类来响应我们的按键消息,我们可以通过ClassWizard对WM_KEYDOWN消息进行响应,当程序运行后,我们按下键盘上的按键,但对话框不会有任何的反应。这是因为在对话框程序中,某些特定的消息,例如按键消息,它们被Windows内部的对话框过程处理了(即在基类中完成了处理,有兴趣...

weixin_33971130的博客 257

VC使用API和发送键盘消息模拟键盘(组合键)消息

Windows大行其道的今天,其界面的操作方式早已被广大用户认可。Windows应用程序大多数都是基于窗体的程序,在大多数情况下,这些程序接收用户输入分为两种:键盘输入和鼠标输入。有时,对于繁杂的,或重复性的输入操作,用程序来模拟键盘及鼠标的输入将会大大提高用户的工作效率,比如在批量打印的时候,让用户重复的设置页边距等参数是一件非常恼火的工作。VC编程实现鼠标模拟在VC模拟鼠标操作(SendMes

feilongzaitianhehe的专栏 1万+
上一篇: 孙鑫VC++深入详解:Lesson8 Part2---属性表单
下一篇: 孙鑫VC++深入详解:Lesson9 Part1---修改应用程序窗口
sergery
博客等级 码龄18年 113粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值