我幾乎完成了一個項目,該項目基本上將取.txt文件的內容,使用'Process.Start(「)打開一個新的記事本實例,記事本「),然後使用」WM_SETTEXT「常量設置文本。我有這個工作很好,所以我不需要任何協助設置文本。但是,我在測試過程中遇到了一個小問題。在記事本實例中設置文本後,如果關閉記事本窗口,它不會詢問您是否希望保存更改。這讓我相信「WM_SETTEXT」不會觸發記事本實例中的「Text_Changed」事件。使用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? –
爲什麼在地球上你用記事本搞亂了?它只是一個TextBox。只需創建自己的。 –