winapi - 在 Win32 应用程序中捕获 SHIFT + TAB 和仅按 TAB 按钮

标签 winapi mfc

我有一个 Win32 应用程序,我想捕获键盘上的 SHIFT + TAB 按钮按下和仅 TAB 键盘按钮按下。我想在 PreTranslateMessage 函数中捕获这两个内容。

这将使我能够根据这些键盘按键执行一些自定义操作。

现在我的代码是,

if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_SHIFT)
    {
        m_shiftKey = TRUE;
    }

    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB)
    {
        // DO Something
        m_shiftKey = FALSE;
        return TRUE;
    }

    if (pMsg->message == WM_KEYDOWN && m_shiftKey && pMsg->wParam == VK_TAB) 
    {
        // DO Something
        return TRUE;
    }

我在这里可以正常按下 TAB 键,但 SHIFT + TAB 组合在这里无法正常工作。

有更好的方法吗?

最佳答案

系统不会为 Shift 键生成键盘输入消息。但是,您可以调用 GetKeyState 查询 Shift 键的当前状态。 .

解决您的问题的一个方法是用以下代码替换第一个 if 子句:

m_shiftKey = ( ::GetKeyState( VK_SHIFT ) < 0 ) ? TRUE : FALSE;

警告:只有当应用程序尚未进入模态循环时,才会执行 PreTranslateMessage 中的代码。每当打开模态对话框、移动窗口或调整窗口大小或者打开菜单时,就会进入模态循环。

关于winapi - 在 Win32 应用程序中捕获 SHIFT + TAB 和仅按 TAB 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31657711/

相关文章:

c++ - 这个神秘的 _TppWaiterpThread 线程的目的是什么

delphi - 在导入表中找不到 SHGetStockIconInfo

c++ -::AddFontMemResourceEx' 尚未声明

c++ - C++/MFC 应用程序内存不足错误

c++ - 可以将成员变量(CBrush *)分配给在具有新原因问题的类构造函数中动态分配的内存吗?

c# - 为没有凭据的不同用户获取特殊文件夹

c++ - 使用资源文件进行 C++ 编译时出错

c++ - TextOut 到设备上下文的中心

c++ - 如何在单独的线程中创建带有进度条的 MFC 对话框?

c++ - std::multimap 编译错误