MFC中,窗口响应键盘消息, PreTranslateMessage响应之前必须先按下方向键?
对话框界面要响应键盘上几个按键的操作,在添加了PreTranslateMessage(MSG*pMsg)消息之后,添加如下代码:现在的问题是,通过调试发现,窗口弹出之后,...
对话框界面要响应键盘上几个按键的操作, 在添加了PreTranslateMessage(MSG* pMsg)消息之后,添加如下代码:
现在的问题是, 通过调试发现, 窗口弹出之后, 无论我怎么按四个方向键以外的其他按键, PreTranslateMessage消息都没有任何反应. 只有在我按一下四个方向键其中之一后, 再按下其他按键才会进入此消息...太奇怪了... 有人知道为什么么...如果实在不行的话, 我在想是不是直接在窗口弹出之前我先人为添加一个方向键按下消息...可是又不知道该如何添加... 求大神解答= =
PreTranslateMessage这个函数我以前也用过, 我看网上大部分人都这么用的, 也没啥问题. 但我以前也是用的对话框类里面的PreTranslateMessage, 现在我这个窗口类是继承自Cwnd的...
我调试的时候发现最初按下其他按键以及第一次按下方向键的时候跟本就进不到PreTranslateMessage函数里面, 只有在按下一次方向键之后, 再按下按键才能进入PreTranslateMessage里面, 此后就一切正常了..
目前我找到一个妥协的办法, 就是我上面提到的, 在窗口弹出之前人为添加一条模拟方向键按下的消息. 我选择在OnSize函数的最后加上了一句::PostMessage(m_hWnd, WM_KEYDOWN, VK_LEFT, 0); 然后再运行的时候就没有任何问题了.
我感觉就是最初PreTranslateMessage被阻塞掉了, 而只有四个方向键能解除阻塞. 但实在不理解为什么... 展开
现在的问题是, 通过调试发现, 窗口弹出之后, 无论我怎么按四个方向键以外的其他按键, PreTranslateMessage消息都没有任何反应. 只有在我按一下四个方向键其中之一后, 再按下其他按键才会进入此消息...太奇怪了... 有人知道为什么么...如果实在不行的话, 我在想是不是直接在窗口弹出之前我先人为添加一个方向键按下消息...可是又不知道该如何添加... 求大神解答= =
PreTranslateMessage这个函数我以前也用过, 我看网上大部分人都这么用的, 也没啥问题. 但我以前也是用的对话框类里面的PreTranslateMessage, 现在我这个窗口类是继承自Cwnd的...
我调试的时候发现最初按下其他按键以及第一次按下方向键的时候跟本就进不到PreTranslateMessage函数里面, 只有在按下一次方向键之后, 再按下按键才能进入PreTranslateMessage里面, 此后就一切正常了..
目前我找到一个妥协的办法, 就是我上面提到的, 在窗口弹出之前人为添加一条模拟方向键按下的消息. 我选择在OnSize函数的最后加上了一句::PostMessage(m_hWnd, WM_KEYDOWN, VK_LEFT, 0); 然后再运行的时候就没有任何问题了.
我感觉就是最初PreTranslateMessage被阻塞掉了, 而只有四个方向键能解除阻塞. 但实在不理解为什么... 展开
展开全部
* 猜想可能是焦点的问题。把焦点改变一下!
or 尝试 添加
case WM_GETDLGCODE:
return DLGC_WANTALLKEYS;
对于对话框程序 你必须要注意 WM_GETDLGCODE 消息 。它有时候很有用。
它的返回值意义如下:
#define DLGC_WANTARROWS 0x0001 /* Control wants arrow keys */
#define DLGC_WANTTAB 0x0002 /* Control wants tab keys */
#define DLGC_WANTALLKEYS 0x0004 /* Control wants all keys */
#define DLGC_WANTMESSAGE 0x0004 /* Pass message to control */
#define DLGC_HASSETSEL 0x0008 /* Understands EM_SETSEL message */
#define DLGC_DEFPUSHBUTTON 0x0010 /* Default pushbutton */
#define DLGC_UNDEFPUSHBUTTON 0x0020 /* Non-default pushbutton */
#define DLGC_RADIOBUTTON 0x0040 /* Radio button */
#define DLGC_WANTCHARS 0x0080 /* Want WM_CHAR messages */
#define DLGC_STATIC 0x0100 /* Static item: don't include */
#define DLGC_BUTTON 0x2000 /* Button item: can be checked */
or 尝试 添加
case WM_GETDLGCODE:
return DLGC_WANTALLKEYS;
对于对话框程序 你必须要注意 WM_GETDLGCODE 消息 。它有时候很有用。
它的返回值意义如下:
#define DLGC_WANTARROWS 0x0001 /* Control wants arrow keys */
#define DLGC_WANTTAB 0x0002 /* Control wants tab keys */
#define DLGC_WANTALLKEYS 0x0004 /* Control wants all keys */
#define DLGC_WANTMESSAGE 0x0004 /* Pass message to control */
#define DLGC_HASSETSEL 0x0008 /* Understands EM_SETSEL message */
#define DLGC_DEFPUSHBUTTON 0x0010 /* Default pushbutton */
#define DLGC_UNDEFPUSHBUTTON 0x0020 /* Non-default pushbutton */
#define DLGC_RADIOBUTTON 0x0040 /* Radio button */
#define DLGC_WANTCHARS 0x0080 /* Want WM_CHAR messages */
#define DLGC_STATIC 0x0100 /* Static item: don't include */
#define DLGC_BUTTON 0x2000 /* Button item: can be checked */
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询