我有“n”个具有相同基本对话框的对话框。每个对话框都有自己的控件
- 编辑框
- 组合框
- 列表控件
- 等等
在基本对话框中,如何设置每个控件的焦点消息,例如,给一个消息框
text("Hello I got focus, my ID is %d")?
最简单的方法是使用经典的子类化方法。问题是WM_SETFOCUS
没有通过消息循环抽,所以PreTranslateMessage
无济于事。
你有一些不错的类,它们有助于在不干扰 MFC 的情况下进行额外的子类化。保罗·迪·拉西亚写道CSubclassWnd
。PJ Naughter 写道CHookWnd
。并且用 ATL 了CWindowsImpl
。
即使窗口已经被 MFC 子类化,所有这些类都允许轻松附加子类化。
您也可以使用“标准子类化” GetWindowLong
/ SetWindowLong
。
正如 Jerry 已经说过做一个钩子,通过 GetParent()和SendMessage(hParentWND, WM_MESSAGE, lParam, wParam)获取父窗口处理程序。
当然,您应该在父窗口中处理 WM_MESSAGE。顺便说一句,当窗口获得焦点时
,框架调用OnSetFocus函数。
根据this SO article,您可以挂钩WM_SETFOCUS
消息。
GetDlgCtrlID
您可以通过与hwnd
钩子返回的一起使用来获取控件 ID 。
但要小心弹出一个MessageBox
,这会改变焦点并触发你的钩子进程,使其进入循环!