2011-07-06 13 views
12

Używam Win32 API i komunikatów Windows próbujących dowiedzieć się, jak działają i znalazłem to question very helpful.Zapisywanie tekstu w Notatniku za pomocą C#/Win32

Chciałbym ulepszyć zawarte w nim rozwiązanie, aby dołączał tekst, zamiast tylko zastępować tekst w notatniku za pomocą WM_SETTEXT.

Moje pytanie brzmi, w jaki sposób mam użyć WM_GETTEXTLENGHT, a następnie WM_GETTEXT, aby uzyskać bieżący tekst w oknie notatnika, aby móc dodać do niego nowy tekst przed użyciem WM_SETTEXT?

Czy używanie WM_XXXTEXT działa na komputerach 32- i 64-bitowych? Jeśli w notatniku znajduje się dużo tekstu, czy proponowany algorytm get/set nadal działa, czy też będzie nosić garść zasobów? Jeśli tak, czy istnieje inny sposób dołączania tekstu do okna notatnika bez uprzedniego skopiowania wszystkiego?

Dzięki za pomoc!

UPDATE:

Oto kod wpadłem na podstawie pomocy Davida Heffernan oraz Google/SO pocięte n wklejania. Ponieważ jestem nowym użytkownikiem Win32API i skopiowałem wiele linii z różnych źródeł, doceniam wszelkie opinie.

[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); 
      } 

     } 

Odpowiedz

8

Wyślij EM_SETSEL umieścić daszka do końca okna edycji. Następnie wyślij EM_REPLACESEL, aby dołączyć tekst.

Jest to znacznie lepsze rozwiązanie niż czytanie całej zawartości, dołączanie dodawania, a następnie ustawianie całej zawartości, jeśli formant edycji zawiera dużą ilość tekstu.

Metody te mogą bez problemu krzyżować granice procesowe 32/64 bitów.

+0

Czy EM_SETSEL i/lub EM_REPLACESEL wymagają fokusu okna? – Evan

+1

Wygląda na to, że nie wymaga ono skupienia, zaktualizuję moje pytanie za pomocą kodu, którego używam na podstawie Twojego rozwiązania. Dzięki za pomoc! – Evan

Powiązane problemy