1

我想重定向空格键按下动作以显示另一个字符(空白字符'·')。

我可以使用什么处理程序或 Windows 消息来执行此操作?

4

1 回答 1

1

一种方法是拦截密钥PreTranslateMessage

BOOL CMyDialog::PreTranslateMessage(MSG* msg)
{
    if (msg->hwnd == m_RichEdit.m_hWnd)
    {
        if (msg->message == WM_CHAR)
        {
            if (msg->wParam == ' ')
            {
                msg->wParam = '.';
                return TRUE;
            }
        }
    }

   return CDialog::PreTranslateMessage(msg);
}

编辑:要使用 Alt 键插入 unicode 字符:

声明成员数据:

int m_key_value;

初始化m_key_value = 0;

检查 Alt 键是否被按下:

BOOL IsKeyDown(int vkCode)
{
    return GetAsyncKeyState(vkCode) & 0x8000;
}

我们想看看 Alt 键按下时是否按下了数字键。我们检查WM_SYSKEYUP(不要检查WM_SYSKEYDOW,因为它会导致重复字符)

BOOL CMyDialog::PreTranslateMessage(MSG* msg)
{
    if (msg->hwnd == m_RichEdit.m_hWnd)
    {
        if (msg->message == WM_SYSKEYUP && IsKeyDown(VK_MENU))
        {
            int i = msg->wParam;
            if (i >= '0' && i <= '9')
                i -= '0';
            else if (i >= VK_NUMPAD0 && i <= VK_NUMPAD9)
                i -= VK_NUMPAD0;
            if (i >= 0 && i <= 9)
            {
                m_key_value *= 10;
                m_key_value += i;
                TRACE("m_key_value = %d\n", m_key_value);
                return TRUE;
            }
        }

        if (msg->message == WM_KEYUP && msg->wParam == VK_MENU && m_key_value)
        {
            TRACE("WM_KEYUP RESULT %d\n", m_key_value);
            if (m_key_value == 160) m_key_value = '.';
            m_RichEdit.PostMessage(WM_CHAR, m_key_value, 0);
            m_key_value = 0;
            return TRUE;
        }

    }
    return CDialog::PreTranslateMessage(msg);
}
于 2015-09-10T06:50:54.093 回答