none
WM_KEYDOWN被翻译成WM_CHAR时不需要WM_KEYUP吗??那系统会如何处理WM_KEYUP消息?谢谢! RRS feed

  • 问题

  • WM_KEYDOWN会被翻译成WM_CHAR,不需要 WM_KEYUP ,但是按键弹起时还是会产生WM_KEYUP消息到队列里吧,这时该如何处理这个消息?

    而且我觉得WM_KEYUP消息没什么用啊,因为翻译时只需要 WM_KEYDOWN消息,根本没用到 WM_KEYUP消息,能不能举个例子用到 WM_KEYUP消息

    对鼠标按键的DOWN和UP消息也有类似的疑问

    2014年4月26日 8:35

答案

  • 您可以做一个测试,创建一个基于Dialog的工程,重载PreTranslateMessage虚函数,在里面加入下面的代码,然后按F5进行Debug,在VS的Output窗口中观察输出的数据:

    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: Add your specialized code here and/or call the base class
    	switch (pMsg->message)
    	{
    	case WM_KEYDOWN:
    		{
    			static int nIndex1 = 0;
    			CString strText(_T(""));
    			strText.Format(_T("WM_KEYDOWN = %u.\r\n"), ++nIndex1);
    			OutputDebugString(strText);
    		}
    		break;
    
    	case WM_KEYUP:
    		{
    			static int nIndex2 = 0;
    			CString strText(_T(""));
    			strText.Format(_T("WM_KEYUP = %u.\r\n"), ++nIndex2);
    			OutputDebugString(strText);
    		}
    		break;
    
    	default:
    		break;
    	}
    	return CDialogEx::PreTranslateMessage(pMsg);
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2014年4月27日 2:20
    版主

全部回复

  •  举个例子,比如很多时候需要处理当按下键的时候做一件事,松开的时候停止。

    比如,按下“+”键的时候,数据连续不断的+1,当松开的时候,停止+1,按下"-"键的时候,数据连续-1,当松开的时候,停止-1.

    鼠标按键事件WM_LBUTTON/WM_LBUTTONUP也有类似的用法.


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2014年4月26日 11:47
    版主
  • 我听说,一直按着某个键不放时是不断地发送KEYDOWN消息,每一个 KEYDOWN 消息处理一次,直到没有 KEYDOWN消息为止,并不是有一个 KEYDOWN消息就一直处理直到KEYUP才停止啊!难道不是这样吗??
    • 已编辑 yu112 2014年4月26日 12:00
    2014年4月26日 11:59
  • 您可以做一个测试,创建一个基于Dialog的工程,重载PreTranslateMessage虚函数,在里面加入下面的代码,然后按F5进行Debug,在VS的Output窗口中观察输出的数据:

    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: Add your specialized code here and/or call the base class
    	switch (pMsg->message)
    	{
    	case WM_KEYDOWN:
    		{
    			static int nIndex1 = 0;
    			CString strText(_T(""));
    			strText.Format(_T("WM_KEYDOWN = %u.\r\n"), ++nIndex1);
    			OutputDebugString(strText);
    		}
    		break;
    
    	case WM_KEYUP:
    		{
    			static int nIndex2 = 0;
    			CString strText(_T(""));
    			strText.Format(_T("WM_KEYUP = %u.\r\n"), ++nIndex2);
    			OutputDebugString(strText);
    		}
    		break;
    
    	default:
    		break;
    	}
    	return CDialogEx::PreTranslateMessage(pMsg);
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2014年4月27日 2:20
    版主
  • 谢谢,等以后我试试,现在试不了,谢谢
    • 已编辑 yu112 2014年4月27日 10:52
    2014年4月27日 10:52
  • 鼠标 DOWN 和 UP 一次就能触发 NM_CLICK,BN_CLICK 之类。

    WM_KEYDOWN 和 WM_KEYUP,你建立一个 Dialog,放置一个 BUTTON,运行,将焦点放置到此 BUTTON 上,然后常按 Enter 键,你会发现此 BUTTON 不断的被点击;好了,现在换一个键,按下空格键,不要松手,你会看到 BUTTON Pressed,但是还没有被 CLICK,当你松开的时候,BUTTON 才被点击。

    2014年4月30日 9:09