2010年1月2日 星期六

CuKeyboard - Conversion LowLevelKeyHook to CuKeyStatus

// 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));
}

1 則留言:

  1. 那 WM_KEYX, WM_SYSKEYX 等要用到時, 在寫囉. 初步看起來 多型是跑不掉的啦!

    回覆刪除