非模态对话框下的键盘响应

本文介绍了一种通过钩子回调函数解决非模态对话框中回车确认和按键响应问题的方法。具体步骤包括声明hook变量、设置窗口钩子、实现回调函数等。

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

在非模态对话框中,并不能响应PreTranslateMessage事件,这让回车确认,或者按键响应其他消息极其纠结。

现在提供一种方法:钩子回调函数,可以解决这个问题:

1、声明hook变量:

HHOOK g_hSearchHook = NULL;

CDlgSearch *g_DlgSearch = NULL;


2、在OnInitDialog()中添加一行:

g_hSearchHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, GetCurrentThreadId());


3、在OnDestroy()中添加一行:

UnhookWindowsHookEx( g_hSearchHook );


4、实现函数GetMsgProc:

LRESULT FAR PASCAL GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    LPMSG lpMsg = (LPMSG)lParam; 
    if( nCode >= 0 && PM_REMOVE == wParam) 
    {
        if( (lpMsg-> message == WM_KEYDOWN)  && lpMsg->wParam == VK_RETURN ) 
        {

           if (::GetDlgCtrlID(lpMsg->hwnd) == IDC_EDIT_CODE 

               || ::GetDlgCtrlID(lpMsg->hwnd) == IDC_EDIT_TEXT_KEYWORD)

                //文本框ID:IDC_EDIT_CODE ,IDC_EDIT_TEXT_KEYWORD

             {

                   //按钮ID: IDC_BUTTON_SEARCH

                   PostMessage(g_DlgSearch->GetSafeHwnd(),
                                          WM_COMMAND,
                                          MAKEWPARAM(IDC_BUTTON_SEARCH, BN_CLICKED),
                                          (LPARAM)(GetDlgItem(g_DlgSearch->GetSafeHwnd(),IDC_BUTTON_SEARCH))); 
             }
        } 
     } 
     return CallNextHookEx(g_hSearchHook, nCode, wParam, lParam); 


搞定!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风迦叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值