// Conversion LowLevelKeyHook to CuKeyStatus
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
static CuKeyboard Keyboard;
Keyboard.FromLowLevelKeyHook(wParam, lParam);
CuKeyNameTextEx KeyNameTextEx(Keyboard.GetKeyStatus());
wstring strKeyboard = KeyNameTextEx;
return 0;
}
CuHook hook;
hook.Init(HookProc, WH_KEYBOARD_LL);
// CuKeyboard.h
class CuKeyboard
{
CuKeyStatus m_KeyStatus;
BOOL m_bScanCode[256];
public:
CuKeyboard(void);
~CuKeyboard(void);
void FromLowLevelKeyHook(WPARAM wParam, LPARAM lParam);
CuKeyStatus GetKeyStatus(){ return m_KeyStatus; }
private:
bool IsFunctionKey(DWORD dwScanCode);
};
// CuKeyboard.cpp
CuKeyboard::CuKeyboard(void)
{
memset((void*)m_bScanCode, 0, sizeof(m_bScanCode) );
}
CuKeyboard::~CuKeyboard(void)
{
}
void CuKeyboard::FromLowLevelKeyHook(WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *pKB = (KBDLLHOOKSTRUCT *)lParam;
//
BOOL bKeyDown = ( (wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN) );
m_bScanCode[pKB->scanCode] = bKeyDown;
//
if( IsFunctionKey(pKB->scanCode) )
{
m_KeyStatus.m_bAlt = m_bScanCode[56];
m_KeyStatus.m_bCtrl = m_bScanCode[29];
m_KeyStatus.m_bShift = (m_bScanCode[42] || m_bScanCode[54]);
}
else
{
if( !bKeyDown )
m_KeyStatus.m_dwScanCode = 0;
else
m_KeyStatus.m_dwScanCode = pKB->scanCode;
}
}
bool CuKeyboard::IsFunctionKey(DWORD dwScanCode)
{
return ((dwScanCode == 56) || (dwScanCode == 29) || (dwScanCode == 42) || (dwScanCode == 54));
}
2010年1月2日 星期六
CuKeyboard - Conversion LowLevelKeyHook to CuKeyStatus
訂閱:
張貼留言 (Atom)
那 WM_KEYX, WM_SYSKEYX 等要用到時, 在寫囉. 初步看起來 多型是跑不掉的啦!
回覆刪除