2017-01-13 2 views
-1

Je sais que cette question a déjà été résolue. Voici mon problème. J'ai un formulaire Windows avec un bouton et une zone de texte. L'utilisateur entre des informations dans la zone de texte, et lorsque l'utilisateur clique sur le bouton, une instance de bloc-notes est lancée et le texte de la zone de texte est ensuite chargé dans le bloc-notes.Copie de texte dans une occurrence de bloc-notes en C#

Voici mon code (que je suis d'une question sur ce site)

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

Quand je lance ce code, pas à pas dans le débogage, il fonctionne très bien, et la logique fait ce que son intention de le faire (copier le texte sur l'instance du bloc-notes). Lorsque je l'exécute en version, rien n'est copié sur l'instance du bloc-notes. Des idées pour lesquelles cela se passe? Non, je ne suis pas exécuter plusieurs instances de bloc-notes ..

+0

Savez-vous ce qui ne fonctionne pas ou échoue? Est-ce qu'il trouve le processus de bloc-notes? Mettez des instructions de journalisation et voyez ce qui se passe. Vous devriez être en mesure de déboguer votre code – dgorti

+1

Cela pose plutôt la question de savoir pourquoi vous ne seriez pas juste d'écrire un fichier texte et l'ouvrir dans le bloc-notes? – spender

+0

Je pense que c'est une question légitime, le problème réside dans le tir SendMessage trop rapidement. J'ai essayé de mettre un Task.Delay dedans mais cela n'a pas aidé. –

Répondre

2

Vous devez attendre jusqu'à ce que le processus est lancé, puis envoyer le texte:

[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

Cela a fonctionné pour mon test. –

+1

Ce serait bizarre de dire que je t'aime, alors merci. C'est la meilleure réponse que je peux trouver sur tout ce site. Merci aussi Musters pour l'aide. Je n'ai pas anticipé le moment de la milliseconde étant éteint à partir de quand le code s'exécute à l'instance de bloc-notes. J'espère que vous appréciez votre week-end. – Mattaceten

+0

juste pour l'enregistrement (pour les spectateurs futurs), il existe d'autres façons de le faire beaucoup plus simple, comme 'StreamWriter fichier2 = nouveau StreamWriter (@" c: \ fichier.txt ", vrai);' obv cela ne pas utiliser l'occurrence "notepad" crée simplement un fichier txt ou s'y ajoute s'il existe déjà. –

0

Quelque chose réutilisable peut-être? BTW, cela ouvre une nouvelle instance de bloc-notes à chaque fois.

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