【发布时间】:2013-06-04 18:22:17
【问题描述】:
我目前正在开发一个使用 WIN32 API 的用户界面 DLL。 DLL 必须适用于多种平台、XP、WIN CE 等。我已设法合并停靠、锚定等,但似乎有关于所有者绘制按钮的问题。我可以绘制按钮的正确状态,焦点,点击,默认。但是,我无法收到关键通知。如果用户按下回车键,我特别想对当前具有焦点的按钮执行单击操作。
请注意,我使用的是 Windows 消息循环而不是对话消息循环。我使用 windows 挂钩来挂钩窗口创建并将用户数据设置为“指向”我的控件实例。如果我在主消息循环中测试 WM_KEYDOWN,我可以获得按钮控件实例的句柄,并将消息转发到相关控件。不幸的是,我正在处理大量遗留代码,这可能不是一个理想的解决方案。
所以,我的问题是什么是最好的前进方式。子类化按钮控件的窗口过程是可行的选择还是有更简单的方法?
非常感谢。
【问题讨论】:
-
如果窗口有焦点,它应该接收键输入,而不需要自定义循环。你用 Spyxx 调查过吗?
-
我同意,但我猜按钮控件在内部处理按键。我需要基本上确保如果按钮具有焦点并且用户按下回车键,则调用“OnClick”处理程序。
-
如果您使用现有的控件类,您不能只是子类化窗口过程来拦截您的消息吗?
-
这有点出乎我的意料,我只是想知道是否有更简单的方法。子类化是如此痛苦:-)
-
好吧,子类化窗口 proc 只是调用 GetWindowLong(GWLP_WNDPROC) 来捕获现有的 proc 和 SetWindowLong(GWLP_WNDPROC) 来包装你的钩子。