c++ - 处理 syskeydown 消息时禁用烦人的声音

标签 c++ windows visual-c++ mfc

您好,我已经从 MFC CEdit 中编写了自己的自定义控件。为此,我需要覆盖 SYS_KEY_UP 和 SYS_KEY_DOWN。然而,每次控件处理这些消息时,都会听到烦人的声音,好像输入无效或其他什么。有谁知道是什么产生了声音以及如何禁用它。

更新代码

// CShotcutEdit

class CShortcutEdit : public CEdit
{
    DECLARE_DYNAMIC(CShortcutEdit)

public:
    CShortcutEdit();
    virtual ~CShortcutEdit();

protected:
    DECLARE_MESSAGE_MAP()

    afx_msg UINT OnGetDlgCode();

    afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

    afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

    afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);

    afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);

    virtual BOOL PreTranslateMessage(MSG* pMsg);

    virtual void DoDataExchange(CDataExchange* pDX);

    virtual void PreSubclassWindow();

    virtual void OnChar(UINT uiChar, UINT uiCount, UINT uiFlags);

    // ... Other Members


};

// ShotcutEdit.cpp : implementation file
//

#include "stdafx.h"
#include "GridPlus.h"
#include "ShortcutEdit.h"


// CShotcutEdit

IMPLEMENT_DYNAMIC(CShortcutEdit, CEdit)

CShortcutEdit::CShortcutEdit()
{

}

CShortcutEdit::~CShortcutEdit()
{

}


BEGIN_MESSAGE_MAP(CShortcutEdit, CEdit)
    ON_WM_GETDLGCODE()
    ON_WM_KEYDOWN()
    ON_WM_SYSKEYDOWN()
    ON_WM_SYSKEYUP()
    ON_WM_KEYUP()
    ON_WM_CHAR()
END_MESSAGE_MAP()

UINT CShortcutEdit::OnGetDlgCode()
{

    return DLGC_WANTARROWS | DLGC_WANTALLKEYS | DLGC_WANTCHARS;
}

void CShortcutEdit::DoDataExchange(CDataExchange* pDX)
{
    CEdit::DoDataExchange(pDX);
}

BOOL CShortcutEdit::PreTranslateMessage(MSG* pMsg)
{
    return CEdit::PreTranslateMessage(pMsg);
}

void CShortcutEdit::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{

}

void CShortcutEdit::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // ... Check for Alt or F10 and translate to string;
}

void CShortcutEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // .. Check for Ctrl Shift and translate to string

}

void CShortcutEdit::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    SetWindowText(L"The desired shortcut is..."); // Should print "alt+f10" for example
}

void CShortcutEdit::OnChar(UINT uiChar, UINT uiCount, UINT uiFlags)
{

}


void CShortcutEdit::PreSubclassWindow()
{
    HideCaret();
    CEdit::PreSubclassWindow();
}

// CShotcutEdit message handlers

最佳答案

这是编辑控件的默认行为。记事本响应 Alt+A 键时执行相同的操作。

要避免声音,重载PreTranslateMessage

BOOL CShortcutEdit::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_SYSKEYDOWN)
    {
        UINT nFlags = HIWORD(pMsg->lParam);
        int nChar = (int)pMsg->wParam;

        if (nChar == 'A' && nFlags & KF_ALTDOWN)
        {
            TRACE("ALT+A Key\n");
            return 1;
        }
    }

    return CEdit::PreTranslateMessage(pMsg);
}

此外,如果您不想要编辑控件,则不要使用它,而不要使用编辑控件并破坏每个输入。

您可能需要 CHotKeyCtrl

关于c++ - 处理 syskeydown 消息时禁用烦人的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259098/

相关文章:

Windows脚本FOR命令重命名目录中的所有文件

c++ - 哪些选项(如果有)在 Visual Studio 2015 中暗示/CLR

c++ - 为什么我们需要默认构造函数来在 C++ 中通过引用传递对象?

c++ - 为什么这个正则表达式会抛出异常?

python - Python 的 C 和 C++ 库如何跨平台?

windows - Rexx - 方括号用法

c++ - 防止外部程序写入文件,外部程序不出现错误

.net - 如何在 Windows Server 2003 上从 IIS 6 提供文件服务?

security - 应用程序逆向工程保护/加固

c++ - 增加字符串文字长度限制