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

Mor*_*hai 5 c++ windows winapi notifications mfc

我发现这种情况不时出现,而且我似乎从来没有一个真正强大的通用解决方案。

我有一个控件 - 在这个例子中是一个对话框上的 EDIT 控件。我想采取某些操作来响应用户 - 并且只有用户 - 修改编辑控件的内容。

可以通过编程方式设置编辑控件 - 例如,在设置对话框时,可能会在编辑字段中放置一个初始值。或者当用户从列表视图中选择一个项目时,该选择的文本很可能就是放置在编辑字段中的内容。

但是当用户修改编辑字段的内容时,我需要知道并做出响应(在这种情况下,我想从相应的列表视图中清除选择)。

我目前正在查看哪些控件具有焦点,并且如果编辑控件具有焦点,则仅将 EN_CHANGE 视为“来自用户”。

这个精美的作品在Windows 7 这个失败XP下(我没有测试过Vista的还)。

在 XP 中,如果编辑字段具有焦点,但用户单击列表视图,并且列表视图告诉编辑控件设置其内容,那么我会收到来自编辑控件的通知,该通知声称仍然具有焦点(: :GetFocus() == 编辑控件的 HWND)。但是这种不正确的状态在 Win7 中不会出现。

这是一个分层接口,因此我无法修改列表视图通知处理程序。它会进行选择更改,并在我不参与或无法真正干预的情况下更新编辑字段,而不是从他们俩那里获得通知。

关于如何普遍地、永久地解决“这个控制通知真的来自用户”难题的任何想法?

MSN*_*MSN 1

您可以随时跟踪LVM_ITEMCHANGINGLVM_ITEMCHANGEDEN_MSGFILTER消息。如果编辑框在之间进行了修改,LVM_ITEMCHANGING并且LVM_ITEMCHANGED没有EN_MSGFILTER中间内容,那么您可能会假设用户没有修改该项目。或者只是检查EN_CHANGE触发时是否选择了任何项目,如果没有或文本与所选项目不匹配,则假设它是用户编辑。

或者使用ES_MULTILINE(来自EN_CHANGE文档):

当使用ES_MULTILINE样式并且通过WM_SETTEXT发送文本时,不会发送EN_CHANGE通知。