对话框中默认按钮捕获回车键时触发编辑控件Kill Focus Handler的方法咨询
对话框中默认按钮捕获回车键时触发编辑控件Kill Focus Handler的方法咨询
嘿,这个问题我之前也碰到过,确实挺闹心的——当对话框里的默认OK按钮捕获回车键时,编辑框的Kill Focus Handler就是不会自动触发,可手动点击OK按钮的时候又一切正常,对吧?
给你几个实用的解决思路,都是不用额外找外部资源就能实现的:
手动触发焦点切换(最推荐):直接在OK按钮的处理函数开头,主动把焦点切换到对话框里的其他控件或者对话框本身,这样系统就会自动给编辑框发送Kill Focus消息了。比如在按钮的
BN_CLICKED处理逻辑里加这么一行代码:SetFocus(GetDlgItem(IDC_DIALOG_MAIN)); // 这里填对话框的ID或者其他非当前编辑框的控件ID都可以等编辑框的Kill Focus Handler执行完,再去处理OK按钮原本的业务逻辑就行,改动小还不容易出问题。
拦截对话框的回车键消息:给对话框添加
WM_KEYDOWN消息处理,当检测到回车键按下且当前焦点在目标编辑框时,先主动给编辑框发送WM_KILLFOCUS消息,再让默认按钮处理后续逻辑。示例代码大概是这样:case WM_KEYDOWN: if (wParam == VK_RETURN) { HWND hCurrentFocus = GetFocus(); if (hCurrentFocus == GetDlgItem(IDC_YOUR_EDIT_CONTROL)) { // 给编辑框发送失焦消息 SendMessage(hCurrentFocus, WM_KILLFOCUS, (WPARAM)GetDlgItem(IDOK), 0); } } return DefWindowProc(hWnd, uMsg, wParam, lParam);这个方法相当于在默认按钮响应之前,先补做了编辑框失焦的触发动作。
顺便提个无关但容易混淆的点:如果是多行编辑框,Want Return属性打开的话,回车键会让编辑框换行而不是触发默认按钮,但你已经明确关了这个属性,所以这个就不用考虑啦。
备注:内容来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

