2017-01-13 5 views
-1

Я знаю, что на этот вопрос уже был дан ответ. Вот моя проблема. У меня есть форма Windows с кнопкой и текстовым полем. Пользователь вводит информацию в текстовое поле, и когда пользователь нажимает кнопку, запускается экземпляр блокнота и текст текстового поля затем загружается в блокнот.Копирование текста в блокнот в C#

Вот мой код (который я получил от вопроса на этом сайте)

[DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
     public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 
     [DllImport("User32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

     private void btnCopyToNotepad_Click(object sender, EventArgs e) 
     { 
      StartNotepad(); 

      Process[] notepads = Process.GetProcessesByName("notepad"); 
      if (notepads.Length == 0) return; 
      if (notepads[0] != null) 
      { 
       Clipboard.SetText(textBox1.Text); 
       SendMessage(FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null), 0x000C, 0, textBox1.Text); 
      } 
     } 
     private static void StartNotepad() 
     { 
      Process.Start("notepad.exe"); 
     } 

Когда я запускаю этот код, пошаговую отладки, он прекрасно работает, и логика делает то, что его намеревались сделать (скопировать текст в экземпляр блокнота). Когда я запускаю его в выпуске, ничего не копируется в экземпляр блокнота. Есть идеи, почему это происходит? Нет я не бегу несколько экземпляров блокнота ..

+0

Знаете ли вы, что не работает или не работает? Находится ли это процесс блокнота? Поместите некоторые заявления о регистрации и посмотрите, что происходит. Вы должны уметь отлаживать свой код – dgorti

+1

Это скорее задает вопрос о том, почему вы не просто напишете текстовый файл и откройте его в блокноте? – spender

+0

Я думаю, что это законный вопрос, проблема заключается в том, что стрельба SendMessage слишком быстро срабатывает. Я попытался поставить Task.Delay, но это не помогло. –

ответ

2

Вам нужно подождать, пока не начнется процесс, а затем отправить текст:

[DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 
    [DllImport("User32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

    private void btnCopyToNotepad_Click(object sender, EventArgs e) 
    { 
     StartNotepad(); 

     Process[] notepads = null; 
     while (notepads == null || notepads.Length == 0) 
     { 
      notepads = Process.GetProcessesByName("notepad"); 
      Thread.Sleep(500); 
     } 

     if (notepads.Length == 0) return; 
     if (notepads[0] != null) 
     { 
      Clipboard.SetText(textBox1.Text); 
      SendMessage(FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null), 0x000C, 0, textBox1.Text); 
     } 
    } 
    private static void StartNotepad() 
    { 
     Process.Start("notepad.exe"); 
    } 
+1

Это сработало для моего теста. –

+1

Было бы странно говорить, что я люблю тебя, так что спасибо. Это лучший ответ, который я могу найти на этом сайте. Спасибо, тоже, за помощь. Я не ожидал, что время в миллисекундах отключается от кода, выполняемого в экземпляр блокнота. Надеюсь, вам понравятся выходные. – Mattaceten

+0

только для записи (для будущих зрителей) есть другие способы сделать это гораздо проще, например 'StreamWriter file2 = новый StreamWriter (@" c: \ file.txt ", true);' obv this does not use «блокнот», просто создает txt-файл или добавляет к нему, если он уже существует. –

0

Что-то Многоразовый может быть? BTW, это каждый раз открывает новый экземпляр блокнота.

using System.Diagnostics; 
using System.Runtime.InteropServices; 

static class Notepad 
{ 
    #region Imports 
    [DllImport("user32.dll")] 
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

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

    //this is a constant indicating the window that we want to send a text message 
    const int WM_SETTEXT = 0X000C; 
    #endregion 


    public static void SendText(string text) 
    { 
     Process notepad = Process.Start(@"notepad.exe"); 
     System.Threading.Thread.Sleep(50); 
     IntPtr notepadTextbox = FindWindowEx(notepad.MainWindowHandle, IntPtr.Zero, "Edit", null); 
     SendMessage(notepadTextbox, WM_SETTEXT, 0, text); 
    } 
} 
Смежные вопросы