代码之家  ›  专栏  ›  技术社区  ›  Mordachai

win32api:如何确定en_更改是由于用户操作,而不是软件操作?

  •  4
  • Mordachai  · 技术社区  · 14 年前

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

    我有一个控件-在本例中是对话框上的编辑控件。我想对用户(而且只有用户)修改编辑控件的内容做出响应。

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

    但是当 用户 修改编辑字段的内容,我需要知道这一点,然后响应(在这个场景中,我想从相应的列表视图中清除选择)。

    我现在正在研究哪个控件有焦点,并且只考虑当编辑控件有焦点时,en_change是“来自用户”的。

    这在windows 7下工作得很好。 这个 在xp下失败 (我还没有测试vista)。

    在xp中,如果编辑字段有焦点,但是用户单击列表视图,列表视图告诉编辑控件设置其内容,那么我将从声称仍有焦点的编辑控件获得通知(::get focus()==hwnd of edit control)。但这种不正确的状态不会在win7中出现。

    这是一个分层接口,因此我无法修改列表视图通知处理程序。它获取一个选择更改,并更新编辑字段,而不需要我的参与,也不需要我真正干预,只需要从这两个字段获取通知。

    有什么想法,如何一般地,永久地解决“这个控制通知真的是来自用户”的难题吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   MSN    14 年前

    你可以一直追踪 LVM_ITEMCHANGING , LVM_ITEMCHANGED EN_MSGFILTER 信息。如果编辑框在 lvm_项目更改 lvm_项已更改 没有 恩纳MSG过滤机 在此期间,您可能会假设用户没有修改该项。或者只检查是否有选择的项目 EN_CHANGE 激发,如果不匹配或文本与所选项目不匹配,则假定它是用户编辑。

    或使用 ES_MULTILINE (从 恩尼变 文件):

    未发送更改通知 使用ES U多行样式时 文本是通过 WME SETTEXT。

        2
  •  1
  •   Ben Voigt    14 年前

    我建议使用正确的信息。en_change太普通,您想知道用户是否键入或粘贴了文本。所以为什么不将控件子类化并监视wm_按键消息呢?

    或者,可以在其他代码中设置设置编辑控件内容的标志。您可能可以假设使WndProc重新进入的任何内容都代表编程更改。

    你不是在找安全的东西,是吗?如果只想排除set内容调用,那就相当简单了。如果您想区分用户操作和用户按键的编程模拟,这是一个困难得多的问题。