【发布时间】: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