我发现这种情况时有发生,我似乎从来没有一个非常强大的通用解决方案.
我有一个控件 – 在这个例子中是对话框的EDIT控件.我想采取某些行动来响应用户 – 只有用户 – 修改编辑控件的内容.
可以以编程方式设置编辑控件 – 例如在设置对话框时,可能会在编辑字段中放置初始值.或者,当用户从列表视图中选择项目时,该选择的文本可能就是放置在编辑字段中的内容.
但是当用户修改编辑字段的内容时,我需要知道并响应(在这种情况下,我想从相应的列表视图中清除选择).
我目前正在研究哪些控件具有焦点,并且如果编辑控件具有焦点,则仅考虑EN_CHANGE是“来自用户”.
这在Windows 7下运行得很好.这在XP下失败了(我还没有测试Vista).
在XP中,如果编辑字段具有焦点,但是用户单击列表视图,并且列表视图告诉编辑控件设置其内容,那么我从编辑控件获得声明仍然具有焦点的通知(: :GetFocus()==编辑控件的HWND).但是在Win7中不会出现这种不正确的状态.
这是一个分层接口,因此我无法修改列表视图通知处理程序.它得到一个选择更改,并更新编辑字段,没有我的参与或能够真正干预,除了从他们两个获得通知.
关于如何一般地永久解决“这个控制通知是否真的来自用户”难题的任何想法?
最佳答案 您始终可以跟踪LVM_ITEMCHANGING,LVM_ITEMCHANGED和EN_MSGFILTER消息.如果在LVM_ITEMCHANGING和LVM_ITEMCHANGED之间修改了编辑框,而中间没有EN_MSGFILTER,那么您可能会认为用户没有修改该项目.或者只是检查EN_CHANGE触发时是否选择了任何项目,如果没有,或者文本与所选项目不匹配,则假设它是用户编辑.
或者使用ES_MULTILINE(来自EN_CHANGE文档):
The EN_CHANGE notification is not sent
when the ES_MULTILINE style is used
and the text is sent through
WM_SETTEXT.