wm_char消息处理

该博客主要介绍了如何处理Windows消息中的WM_CHAR消息,用于捕获字符键盘输入。在`inputControlManager_WndProc`函数中,当接收到WM_CHAR消息时,会调用`inputManager_PC::ProcessCharInput`进行处理。同时,文章提到了`inputCKeyboard`类的使用,用于管理键盘输入状态,并通过`ChangeState`方法更新按键状态。在`inputCBase`类中,实现了状态改变的回调机制,确保了输入系统的响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static LRESULT CALLBACK inputControlManager_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

       {

 

      /**************************************************

      Character Key Input

      **************************************************/

       case WM_CHAR:

            {

            inputManager_PC::p().ProcessCharInput(WM_CHAR, wParam);

            }

            break;

}

}

 

 

class inputCKeyboard*    m_pKeyboard;      

bool inputManager_PC::Init       (int a_Value)

{

    if (a_Value == PT_SYSTEM)

        {

        m_pKeyboard = new inputCKeyboard("Keyboard_0");

      }

}

inputCKeyboard::inputCKeyboard(char* a_pName, int a_HardwareId , int a_ControllerGroup) : inputCBase (a_pName, a_HardwareId , a_ControllerGroup)

{

    SetType(C_KEYBOARD);

    RequestCallbackListSize(eGuiCBase::CB_SHARED_MAX);   

}

inputCBase::inputCBase(char* a_pName, int a_HardwareId, int a_ControllerGroup)

{

CREATE_MANAGED(inputCBase, DM_INPUT_CONTROLS, a_pName);

// #define CREATE_MANAGED(value, index, name) m_pDataManaged = new DM_DATA_P_S<value>(index, this, name);

// DM_DATA_P_S(int a_Slot, void* a_pParent, const char* a_pName) : DM_DATA_P(a_Slot, a_pParent, a_pName){};

// DM_DATA_P::DM_DATA_P(int a_Slot, void* a_pParent, const char* a_pName)

//{

    //m_pParent = a_pParent;

    //dataManager::p().AddData(a_Slot, this, a_pName);

//}

    SetControllerGroup(a_ControllerGroup);

    m_HardwareId = a_HardwareId;

}

 

void inputManager_PC::ProcessCharInput(“WM_CHAR,’c’”)

{

    // Process Keyboard

    if (m_pKeyboard)

        {

        // Set the key information and tag the change

        m_pKeyboard->HardwareId() = ‘c’;

        m_pKeyboard->ChangeState(eGuiCBase::CB_SELECT);

        }

}

 

bool inputCKeyboard::ChangeState(int a_NewState, void* a_Data)

{

    // Keys automatic release on select

    bool result = inputCBase::ChangeState(a_NewState, a_Data);

    if (a_NewState == eGuiCBase::CB_SELECT)

        {

        inputCBase::ChangeState(eGuiCBase::CB_NORMAL);           

        }

 

    return result;

}

virtual bool ChangeState(int a_NewState, void* a_Data = 0) {SetState(a_NewState, a_Data); return true;}

 

void guiCBase::SetState   (int a_NewState, void* a_pData)

{

    if (m_State == a_NewState)

        return;

 

    m_State = a_NewState;

    CallCallback(a_NewState, a_pData);

    CallCallback(eGuiCBase::CB_ON_CHANGE, a_pData);

}

inline void guiCBase::CallCallback       (int      a_Value, void* a_pData)

{

    if ((m_CallbackList.IsItemValid(a_Value))  && (a_Value >= eGuiCBase::CB_BASE_BEGIN))

        {

          CallCallbackEx( m_CallbackList.ItemP(a_Value), a_pData);

        }

}

 

void guiCBase::CallCallbackEx(LL_List* a_pList, void* a_pData)

{

    if (a_pList == NULL)

        return;

 

    LL_ForEach_B(a_pList)

        CB_Imp_GuiC_Callback* pCallback = LL_ForEach_GetData(CB_Imp_GuiC_Callback, CB_Imp_GuiC_Callback::m_Link);

        if (pCallback->m_CallbackMask.m_Mask&m_CallbackMask)

            pCallback->Call_CB(this, a_pData);

    LL_ForEach_E

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值