不知道大家用过SSCOM32这个串口调试工具。
当选择16进制的时候会捕获键盘键盘的输入,如果输入值非0~9或a~f或A~F就会提示。
我的方法是重载PreTranslateMessage函数,加入判断语句
if(pMsg->message==WM_KEYDOWN) 
{
if( pMsg->wParam<'0' || (pMsg->wParam>'9'&&pMsg->wParam<'A') || (pMsg->wParam>'F'&&pMsg->wParam<'a') || pMsg->wParam>'f' )
……
}
可是出现两个问题:
1。按下任何一个键盘都会进行判断,可是我只想捕获能输入编辑框的值进行判断。
2。小键盘输入的数字无法通过此判断语句。我知道我的方法是错误的,请问正确的方法是什么。

解决方案 »

  1.   

    你可以把你不要的键屏蔽啊,如系统键等,直接return不进入判别就行了
    switch(pMsg->wParam)
    case VK_F1:
    case VK_F2:
    case VK_F3:
    ..........
    bread;
    ................
    类似的
      

  2.   


    BOOL CXXX:PreTranslateMessage(MSG* pMsg)
    {
     if(GetDlgItem(IDC_EDIT)->GetSafeHwnd() == pMsg->hwnd && WM_KEYDOWN == pMsg->message)
    {
     if((pMsg->wParam >= '0' && pMsg->wParam <= '9') || (pMsg->wParam >= 'a' && pMsg->wParam <= 'f') || (pMsg->wParam >= 'A' && pMsg->wParam <= 'Z'))
    {
     ... return TRUE;
    }
    }
     return CXXX:PreTranslateMessage(pMsg);
    }
      

  3.   

    PreTranslateMessage 这个函数你是放在对话框中吗?
    我的想法是,把这个PreTranslateMessage先写在app中,然后在对话框中也来接收PreTranslateMessage这个消息,然后通过判断如果焦点在编辑控件上,就处理PreTranslateMessage传来的按键。
    小键盘没研究过,你在PreTranslateMessage函数入口处加断点,按小键盘,看看传来的消息是什么,添加进去就可以了。
      

  4.   

    感谢大家的关注,经过一番尝试我自己弄好了。
    程序在发送WM_KEYDOWN后,如果是字符消息还会接着发送WM_CHAR。
    只要将判断语句中的WM_KEYDOWN改成WM_CHAR就能屏蔽大部分按键消息,应为它只捕获字符消息。
    当然还有一些消息需要屏蔽,具体请看下面的代码吧:if( (GetFocus()==GetDlgItem(IDC_EDIT)) && 
    m_ctrlHexSend.GetCheck() &&
    (pMsg->message==WM_CHAR)  
     )
    {
    switch (pMsg->wParam) {
    case 0x08:
    //backsapce,必须
    break;
    case 0x0A:
    //linefeed(ctrl+Enter),必须
    break;
    case 0x1B:
    //escape,由于先执行退出,实际不会到这里
    break;
    case 0x09:
    //tab,由于先执行焦点转移, 实际不会到这里
    break;
    case 0x0D:
    //carriage return(Enter),必须
    break;
    default://Process displayable characters
    if( pMsg->wParam<'0' || (pMsg->wParam>'9'&&pMsg->wParam<'A') || (pMsg->wParam>'F'&&pMsg->wParam<'a') || pMsg->wParam>'f' ) 
    {
    AfxMessageBox("请输入十六进制数!");
    return true;
    }
    break;
    }
    }