2011-07-06 48 views
12

我搞砸Win32 API和Windows消息試圖弄清楚事情是如何工作的,我發現這個question very helpful用C#/ Win32寫文本到記事本

我想改進提供的解決方案,以便它附加文本而不是通過WM_SETTEXT替換記事本中的文本。

我的問題是,我將如何使用WM_GETTEXTLENGHT,緊接着WM_GETTEXT,獲取記事本窗口中的當前文本,以便我可以在使用WM_SETTEXT之前向它追加新文本?

在32位和64位計算機上都使用WM_XXXTEXT嗎?如果記事本中有很多文本,那麼建議的獲取/設置算法是否仍然有效,或者是否會佔用大量資源?如果是這樣,是否有另一種方式來追加文本到記事本窗口,而不是先複製所有內容?

感謝您的幫助!

UPDATE:

這裏是我想出了根據大衛·赫弗南的幫助和谷歌/ SO削減ñ粘貼代碼。由於我是Win32API的新手,並且從不同來源複製了很多行,所以我會很感激所有的反饋。

[DllImport("User32.dll", CharSet = CharSet.Auto)] 
     extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName); 

     [DllImport("User32.dll", EntryPoint = "SendMessage")] 
     extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

     [DllImport("User32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

     [DllImport("User32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam); 

     const int WM_GETTEXTLENGTH = 0x000E; 

     const int EM_SETSEL = 0x00B1; 

     const int EM_REPLACESEL = 0x00C2; 

     public void testAppendText(string text) 
     { 
      Process[] notepads = Process.GetProcessesByName("notepad"); 
      if (notepads.Length == 0) return; 
      if (notepads[0] != null) 
      { 
       IntPtr editBox = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null); 
       int length = SendMessageGetTextLength(editBox, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero); 
       SendMessage(editBox, EM_SETSEL, length, length); 
       SendMessage(editBox, EM_REPLACESEL, 1, text); 
      } 

     } 

回答

8

發送EM_SETSEL將插入符號放到編輯窗口的末尾。然後發送EM_REPLACESEL來追加文字。

如果編輯控件包含大量文本,這比讀取整個內容,添加附加內容,然後設置整個內容好得多。

這些方法可以毫無困難地跨越32/64位處理邊界。

+0

EM_SETSEL和/或EM_REPLACESEL是否需要窗口焦點? – Evan

+1

它似乎並不需要關注,我會根據您的解決方案使用我正在使用的代碼更新我的問題。謝謝你的幫助! – Evan