捕获 Win32 App 中的 SHIFT + TAB 和 TAB only 按钮按下
Capturing SHIFT + TAB and TAB only button presses in Win32 App
我有一个 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 键生成键盘输入消息。但是,您可以查询 Shift 键的当前状态调用 GetKeyState.
您的问题的一个解决方案是用以下代码替换您的第一个 if
子句:
m_shiftKey = ( ::GetKeyState( VK_SHIFT ) < 0 ) ? TRUE : FALSE;
一句警告:PreTranslateMessage
中的代码仅在应用程序未进入模态循环时执行。每当打开模态对话框、移动或调整 window 大小或打开菜单时,都会进入模态循环。
我有一个 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 键生成键盘输入消息。但是,您可以查询 Shift 键的当前状态调用 GetKeyState.
您的问题的一个解决方案是用以下代码替换您的第一个 if
子句:
m_shiftKey = ( ::GetKeyState( VK_SHIFT ) < 0 ) ? TRUE : FALSE;
一句警告:PreTranslateMessage
中的代码仅在应用程序未进入模态循环时执行。每当打开模态对话框、移动或调整 window 大小或打开菜单时,都会进入模态循环。