2013-12-21 44 views
2

我幾乎完成了一個項目,該項目基本上將取.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; 
} 
+1

您可以嘗試將文本複製到剪貼板,然後發送WM_PASTE命令而不是WM_SETTEXT。 –

+0

但實際上這並不是一個壞主意,因爲這種軟件一次可以從10-50個記事本文件中恢復任何地方,所以它不可行。我也不想在運行恢復軟件時替換用戶的剪貼板文本;)但是說了這麼多,我以前從未使用過WM_PASTE,所以出於好奇,使用它的好處是什麼,比如說,將文本複製到剪貼板,使用Clipboard.GetText()檢索它,然後使用WM_SETTEXT而不是WM_PASTE? –

+2

爲什麼在地球上你用記事本搞亂了?它只是一個TextBox。只需創建自己的。 –

回答

3

編輯控件保持性能文本修改爲不同的實體,允許應用程序建立自己的自己對其進行修改管理。發送WM_SETTEXT message不會自動設置修改的標誌。要設置此標誌,您必須明確發送EM_SETMODIFY message到編輯控件。

+0

謝謝你。我進一步研究了它,發現了EM_SETMODIFY常量,並且在10分鐘前試圖回答我自己的問題,但是我沒有足夠的聲望去做!大聲笑 –