使用WM_SETTEXT设置记事本文本不会影响记事本实例中的Text_Changed事件

时间:2013-12-21 21:41:47

标签: c# .net winforms winapi pinvoke

我差不多已经完成了一个项目,它基本上会获取.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;
}

1 个答案:

答案 0 :(得分:3)

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