c – Win32API:如何确定EN_CHANGE是否是由于用户操作而不是软件操作?

我发现这种情况时有发生,我似乎从来没有一个非常强大的通用解决方案.

我有一个控件 – 在这个例子中是对话框的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.

点赞