hotkeyctrlex.cpp
来自「管理项目进度工具的原代码」· C++ 代码 · 共 132 行
CPP
132 行
// hotkeyctrlex.cpp : implementation file
//
#include "stdafx.h"
#include "hotkeyctrlex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHotKeyCtrlEx
CHotKeyCtrlEx::CHotKeyCtrlEx(BOOL bGlobal) :
m_wInvalidComb(0), m_wModifiers(0), m_bGlobal(bGlobal)
{
}
CHotKeyCtrlEx::~CHotKeyCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CHotKeyCtrlEx, CHotKeyCtrl)
//{{AFX_MSG_MAP(CHotKeyCtrlEx)
//}}AFX_MSG_MAP
ON_MESSAGE(HKM_SETRULES, OnSetRules)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHotKeyCtrlEx message handlers
LRESULT CHotKeyCtrlEx::OnSetRules(WPARAM wParam, LPARAM lParam)
{
m_wInvalidComb = (WORD)wParam;
m_wModifiers = LOWORD(lParam);
return 0L;
}
void CHotKeyCtrlEx::SetHotKey(WORD wVirtualKeyCode, WORD wModifiers)
{
CHotKeyCtrl::SetHotKey(wVirtualKeyCode, wModifiers);
}
void CHotKeyCtrlEx::SetHotKey(DWORD dwHotkey)
{
SetHotKey(LOWORD(dwHotkey), HIWORD(dwHotkey));
}
BOOL CHotKeyCtrlEx::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->hwnd == *this)
{
UINT nChar = pMsg->wParam;
UINT nFlags = HIWORD(pMsg->lParam);
BOOL bCtrl = (GetKeyState(VK_CONTROL) & 0x8000);
BOOL bShift = (GetKeyState(VK_SHIFT) & 0x8000);
BOOL bAlt = (GetKeyState(VK_MENU) & 0x8000);
BOOL bExtended = (nFlags & 0x100);
WORD wModifiers = (WORD)((bCtrl ? HOTKEYF_CONTROL : 0) |
(bShift ? HOTKEYF_SHIFT : 0) |
(bAlt ? HOTKEYF_ALT : 0) |
(bExtended ? HOTKEYF_EXT : 0));
switch (nChar)
{
case VK_DELETE:
case VK_BACK:
case VK_SPACE:
case VK_TAB:
{
// some keys not to process by themselves
if (!bCtrl && !bShift && !bAlt)
{
switch (nChar)
{
case VK_BACK:
return CHotKeyCtrl::PreTranslateMessage(pMsg);
case VK_TAB:
{
CWnd* pNext = GetParent()->GetNextDlgTabItem(this);
if (pNext != this)
{
pNext->SetFocus();
return TRUE; // eat the message
}
}
break;
}
}
// check for breaking rules
BOOL bFail = ((m_wInvalidComb & HKCOMB_NONE) && !bCtrl && !bShift && !bAlt);
bFail |= ((m_wInvalidComb & HKCOMB_S) && !bCtrl && bShift && !bAlt);
bFail |= ((m_wInvalidComb & HKCOMB_C) && bCtrl && !bShift && !bAlt);
bFail |= ((m_wInvalidComb & HKCOMB_A) && !bCtrl && !bShift && bAlt);
bFail |= ((m_wInvalidComb & HKCOMB_SC) && bCtrl && bShift && !bAlt);
bFail |= ((m_wInvalidComb & HKCOMB_SA) && !bCtrl && bShift && bAlt);
bFail |= ((m_wInvalidComb & HKCOMB_CA) && bCtrl && !bShift && bAlt);
bFail |= ((m_wInvalidComb & HKCOMB_SCA) && bCtrl && bShift && bAlt);
if (bFail)
wModifiers = (WORD)(m_wModifiers | (bExtended ? HOTKEYF_EXT : 0));
SetHotKey((WORD)nChar, wModifiers);
// send parent notification manually
GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), EN_CHANGE), (LPARAM)GetSafeHwnd());
return TRUE;
}
break;
// keys not allowed as global (MS reserved)
case VK_F12:
if (m_bGlobal && !bCtrl && !bShift && !bAlt)
return TRUE; // eat
break;
}
}
return CHotKeyCtrl::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?