【问题标题】:Using WM_SETTEXT to set Notepad text is not affecting Text_Changed event in the Notepad instance使用 WM_SETTEXT 设置记事本文本不会影响记事本实例中的 Text_Changed 事件
【发布时间】:2013-12-21 21:41:46
【问题描述】:

我几乎完成了一个项目,该项目基本上将获取 .txt 文件的内容,使用“Process.Start(“notepad”)”打开一个新的记事本实例,然后使用“WM_SETTEXT”常量设置文本.我的这个工作很好,所以我不需要任何帮助来设置文本。但是,我在测试期间注意到了一个小问题。在记事本实例中设置文本后,如果您关闭记事本窗口,它不会询问您是否要保存更改。这让我相信“WM_SETTEXT”不会在记事本实例中触发“Text_Changed”事件。

经过一番思考,我意识到这也可能意味着记事本仅在用户手动键入内容时才要求保存更改。所以也许不是检查“Text_Changed”,而是检查“Mouse_Down”事件?无论是哪一种,我都希望有人对记事本的“内部”工作原理以及它如何检查需要保存的文本是否有“更改”有更多了解。

这是我的 SetText 函数的一部分:

        if (FileIO.Index != null && FileIO.Index.Count > 0)
        {
            MessageBox.Show("Recovering " + FileIO.Index.Count + " files...");
            foreach (string guid in FileIO.Index)
            {
                if (!string.IsNullOrWhiteSpace(guid))
                {
                    string contents = "";
                    if (!FileIO.Recover(guid, out contents))
                        MessageBox.Show("Couldn't recover '" + guid + "'");
                    else
                    {
                        Process p = Process.Start("notepad");
                        Thread.Sleep(200);
                        SetText(GetNotepadEditBox(p.MainWindowHandle), contents);
                    }
                }
            }
            MessageBox.Show("Recovered all files successfully!", "Done recovering files!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

方法:

private static IntPtr GetNotepadEditBox(IntPtr hParentWindow)
{
    return Win32.FindWindowEx(hParentWindow, IntPtr.Zero, "Edit", null);
}

private void SetText(IntPtr hEditBox, string text)
{
    IntPtr len = new IntPtr(text.Length);
    StringBuilder sb = new StringBuilder(text);

    Win32.SendMessage(hEditBox, Win32.WM_SETTEXT, len, sb);

    sb = null;
    len = IntPtr.Zero;
}

【问题讨论】:

  • 您可以尝试将文本复制到剪贴板,然后发送 WM_PASTE 命令而不是 WM_SETTEXT。
  • 这实际上不是一个坏主意,但是,这是不可行的,因为该软件一次将恢复 10-50 个记事本文件。我也不想在运行恢复软件时替换用户的剪贴板文本;)但话虽如此,我以前从未使用过 WM_PASTE,所以出于好奇,使用它与将文本复制到剪贴板,使用 Clipboard.GetText() 检索它,然后使用 WM_SETTEXT 而不是 WM_PASTE?
  • 你到底为什么要搞乱记事本?它只是一个文本框。只需创建自己的。
  • 这完全无关紧要,我很高兴我们在同一页面上关于“创建我自己的”很简单,感谢您的洞察力;)但我有一个客户虔诚地使用记事本快速记笔记,但往往忘记保存它们,然后停电,关闭计算机等,丢失所有笔记。我提到了创建另一个具有“自动保存”功能的记事本的想法,但他不希望他“喜欢记事本的感觉”。无论如何,问题仍然存在,如果您对我有任何想法,我将非常感谢您的帮助。

标签: c# .net winforms winapi pinvoke


【解决方案1】:

编辑控件将属性 textmodified 保留为不同的实体,允许应用程序围绕它们构建自己的修改管理。发送 WM_SETTEXT message 不会自动设置 modified 标志。要设置此标志,您必须显式发送 EM_SETMODIFY message 到编辑控件。

【讨论】:

  • 谢谢你。我进一步研究并发现了 EM_SETMODIFY 常量,并在大约 10 分钟前尝试回答我自己的问题,但是我没有足够的声誉这样做!大声笑
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多