2011-07-06 19 views
12

私はWin32 APIとWindowsメッセージを使いこなしています。どのように動作するかを調べると、これが見つかりました。question very helpfulC#/ Win32でメモ帳にテキストを書き込む

そこに用意されている解決策を改善して、メモ帳のテキストをWM_SETTEXTで置き換えるのではなく、テキストを追加するようにしたいと思います。

私の質問は、WM_GETTEXTLENGHTとそれに続くWM_GETTEXTを使用して、メモ帳ウィンドウの現在のテキストを取得して、WM_SETTEXTを使用する前に新しいテキストを追加できるのですか?

WM_XXXTEXTは32ビットと64ビットの両方のマシンで使用できますか?メモ帳にたくさんのテキストがある場合、提案されているget/setアルゴリズムはまだ動作していますか、それともリソースの束を抱えていますか?もしそうなら、最初にすべてをコピーせずにメモ帳ウィンドウにテキストを追加する別の方法はありますか?

ありがとうございます!

UPDATE:

ここで私はデビッドHeffernanのの助けとGoogle/SOカットn個の貼り付けに基づいて思い付いたコードです。私は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