对话框捕获WM_KEYDOWN消息

在对话框程序中,我们经常利用对话框上的子控件进行命令响应来处理一些事件,如果我们想要让对话框类本身(子控件的父窗口)来响应我们的按键消息,须利用ProcessMessageFilter虚函数来捕获对话框的WM_KEYDOWN消息;

  virtual BOOL ProcessMessageFilter( int code, LPMSG lpMsg );

1、新建MFC工程:WinSun

2、在CWinSunApp类上右击添加成员变量:HWND m_hwndDlg

  

3、在CWinSunApp类的源文件中的InitInstance()函数的“return FALSE;”之前添加变量m_hwndDlg的初始化:

  m_hwndDlg=NULL;

4、在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->hwnd==m_hwndDlg) || ::IsChild(m_hwndDlg,lpMsg->hwnd)){
            //如果消息是WM_KEYDOWN,则弹出消息框
            if(lpMsg->message==WM_KEYDOWN){
                AfxMessageBox("捕获WM_KEYDOWN消息成功");
            }
        }
    }
    
    return CWinApp::ProcessMessageFilter(code, lpMsg);
}

5、在CWinSunDlg类的OnInitialDialog()函数中的“return TRUE;”之前添加代码:

// TODO: Add extra initialization here
//将对话框的句柄传递到CWinSunApp类中
((CWinSunApp*)AfxGetApp())->m_hwndDlg=m_hWnd;

6、在对话框窗口销毁后,须将CWinSunApp类中的变量m_hwndDlg置为NULL,为此需在CWinSunDlg类上右击添加WM_DESTROY的消息响应函数:

    

void CWinSunDlg::OnDestroy() 
{
    CDialog::OnDestroy();
    
    // TODO: Add your message handler code here
    ((CWinSunApp*)AfxGetApp())->m_hwndDlg=NULL;
    
}

7、至此,对话框就可以自己捕获WM_KEYDOWN消息了,要捕获WM_KEYUP和WM_CHAR消息,方法类似;

时间: 2024-10-10 23:45:22

对话框捕获WM_KEYDOWN消息的相关文章

Win32 Dialog对话框处理WM_KEYDOWN事件

MFC中重写虚函数PreTranslateMessage里是可以过滤WM_KEYDOWN消息的.但是如果是Win32 SDK中利用DialogBox/DialogBoxParam创建模态对话框一般行为是不处理WM_KEYDOWN消息的.如果该对话框中没有任何的子控件的话,在对话框的窗口回调函数DlgProc()中是可以过滤到WM_KEYDOWN消息的,不过并不是所有的键的消息都可以捕获到,例如像Tab键,上下左右方向键VK_UP/VK_DOWN/VK_LEFT/VK_RIGHT等都没有办法捕获到

spy++捕获窗口消息

打开spy++,窗口截图如下,点击窗口搜索按钮(红框标识) ,如果找不到对应的窗口,鼠标右键刷新即可. 鼠标左键点击窗口搜索图标,按住不放,拖到需要抓取消息的窗口上: spy++会自动在列表中高亮定位抓取到的窗口,如下图所示,notepad++的new1窗口被抓取到了.再点击菜单栏 监视->日志消息: 在弹窗的消息选项弹窗中,可以选择需要打印的日志的消息,可以通过消息组选择一类消息,也可以在左侧"要查看的消息"中,通过鼠标左键点击选择和取消选择,也可以通过连续按键盘字母键查找对应

对话框捕获鼠标移动消息,实现“逃跑按钮”

在弹出的对话框上显示逃跑按钮,当鼠标移动到该按钮上时,该按钮隐藏,而在别的位置上显示一个一模一样的按钮,鼠标再次置于新按钮上时,该按钮再次隐藏而在另一位置显示,用户感觉按钮好像在自动逃跑移动: 1.新建一个基于对话框的MFC工程,将其资源窗口的对话框中的自带控件删除,在不同位置添加两个一模一样的按钮控件 2.此处需要让按钮来捕获鼠标移动的消息,但是该对话框中有两个一样的按钮,故需要创建一个派生于CButton类的新的类CNewButton,为两个按钮控件分别添加成员变量并与CNewButton类

对话框屏蔽键盘消息方法

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) { return TRUE; } if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) { return TRUE; } return

[ucgui] 对话框4——模式消息窗口

>_<" 这里实现点击灰色窗口的按钮出现一个模式消息窗口,点击OK之后才能再聚焦到灰窗口:点击灰窗口除了按钮的地方,弹出一个非模式窗口. 1 static const GUI_WIDGET_CREATE_INFO _aDialogOrder[] = {//大的一个窗口(刚开始显示的,有一个按钮) 2 { FRAMEWIN_CreateIndirect, "Order vehicle", 0, 20, 50, 480, 360, 0 }, 3 { BUTTON_Cr

C#捕获鼠标消息

在C#中怎样禁用鼠标按键,我们可以通过ImessageFilter接口下的PreFilterMessage方法.Application类的AddMessageFilter方法,RemoveMessageFilter方法和Message结构的Msg属性来禁用鼠标左键.Message结构包装Windows发送的消息,可使用该结构包装消息,并将其分配给窗口过程以进行调度,还可以使用该结构获取系统向应用程序或控件发送的关于某个消息的信息. 使用PreFilterMessage方法在调度消息之前将其筛选出

C#通过IMessageFilter捕获鼠标消息(转载)

在c#中怎样禁用鼠标左键的使用,其实我们可以通过ImessageFilter接口下的PreFilterMessage方法.Application类的AddMessageFilter方法,RemoveMessageFilter方法和Message结构的Msg属性来禁用鼠标左键.Message结构包装Windows发送的消息,可使用该结构包装消息,并将其分配给窗口过程以进行调度,还可以使用该结构获取系统向应用程序或控件发送的关于某个消息的信息. 使用PreFilterMessage方法在调度消息之前

通过GUI制作一个简单的消息对话框互发消息

public class LTS extends JFrame { private JPanel contentPane; private JTextField textField; private JTextField textField_1; /** * Launch the application. */ private static PrintWriter pw=null; private static BufferedReader br=null; private static Soc

VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)

基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情况下这些子窗口已经截获了焦点,因此键盘消息已经被控件捕获了:同时为了实现控件焦点切换和对话框默认行为,  VK_TAB.VK_LEFT.VK_RIGHT.VK_UP.VK_DOWN. VK_RETURN.VK_ESCAPE 等键已经被截获处理,因此对话框没有控件时仍然不能完全响应按键消息. 关于热键