我差不多已经完成了一个项目,它基本上会获取.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;
}
答案 0 :(得分:3)
编辑控件将属性 text 和 modified 保持为不同的实体,允许应用程序围绕它们构建自己的修改管理。发送WM_SETTEXT
message不会自动设置已修改的标志。要设置此标记,您必须显式向编辑控件发送EM_SETMODIFY
message。