2009-12-07 8 views
1

J'ai le code suivant qui fonctionne bien dans le bloc-notes, mais pas dans WORD !!comment puis-je simuler CTRL + C en C#

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

[DllImport("user32.dll")] 
public static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll", SetLastError = true)] 
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

[DllImport("kernel32.dll")] 
public static extern uint GetCurrentThreadId(); 

[DllImport("user32.dll")] 
public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach); 

[DllImport("user32.dll")] 
public static extern IntPtr GetFocus(); 

[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam); 

// second overload of SendMessage 
[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam); 

[DllImport("user32.dll")] 
public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); 

public const uint WM_GETTEXT = 0x0D; 
public const uint WM_GETTEXTLENGTH = 0x0E; 
public const uint EM_GETSEL = 0xB0; 

     IntPtr hWnd = WinUser.GetForegroundWindow(); 
     uint processId; 
     uint activeThreadId = WinUser.GetWindowThreadProcessId(hWnd, out processId); 
     uint currentThreadId = WinUser.GetCurrentThreadId(); 

     WinUser.AttachThreadInput(activeThreadId, currentThreadId, true); 
     IntPtr focusedHandle = WinUser.GetFocus(); 
     WinUser.AttachThreadInput(activeThreadId, currentThreadId, false); 

     int len = WinUser.SendMessage(focusedHandle, WinUser.WM_GETTEXTLENGTH, 0, null); 
     StringBuilder sb = new StringBuilder(len); 
     int numChars = WinUser.SendMessage(focusedHandle, WinUser.WM_GETTEXT, len + 1, sb); 

     int start, next; 
     string selectedText = ""; 
     WinUser.SendMessage(focusedHandle, WinUser.EM_GETSEL, out start, out next); 
     try 
     { 
      selectedText = sb.ToString().Substring(start, next - start); 
     } 

malheureusement, les déclarations ci-dessus "{Microsoft Word}" lors de la sélection d'un texte dans Word ou tout autre "richtextbox". Comment CTRL + C le fait-il?

REMARQUE: Cela fonctionne très bien dans le bloc-notes ou sur n'importe quel éditeur de texte simple.

+0

Voulez-vous simuler une pression de touche ou des données de copie? – Benny

+0

Non, je veux juste copier les données d'une autre fenêtre. Sans utiliser CTRL + C, au lieu de faire ce qui précède. – Anand

+0

Je ne peux pas croire quelqu'un a voté cette question et il y a plus de 1K vues !! .. – Anand

Répondre

3
+0

cela pourrait être! merci laissez-moi vérifier. En fait, j'ai obtenu le code de base de ce site – Anand

+0

Salut, cela a bien fonctionné, mais j'ai complètement oublié mon principal besoin de faire cela n'était pas d'enregistrer les données dans le presse-papiers de Windows. C'est la raison pour laquelle je devais simuler Ctrl + C et ne pas l'utiliser. :) – Anand

+1

copier le contenu du presse-papiers, simuler Ctrl + c lire à nouveau, et restaurer l'original. –

1

Je pense que vous devriez regarder dans ce tutoriel sur C# Clipboard Copy and Pasting. L'utilisation de copier coller en C# n'est pas aussi difficile que vous pourriez le penser.

Copie

Clipboard.SetText(txtClipboard.Text); 

Pâte

txtClipboard.Text = Clipboard.GetText(); 

Vérifiez le lien ci-dessus pour plus d'informations et des exemples. Vous devriez également regarder le MSDN page pour Clipboard.

+0

ya en utilisant le presse-papiers est facile, mais je cherche à copier le texte sans l'utilisation de CTRL + C, je suis en train de simuler - ne pas l'utiliser. Par conséquent, le presse-papiers serait vide. – Anand

+0

bien le commentaire de priyank a contribué à provoquer dans ce lien ils envoient un message pour simuler ctrc + c et puis je pourrais utiliser l'objet presse-papiers comme vous suggéré .. merci – Anand

+0

priyanks commentaire a bien fonctionné, mais j'ai complètement oublié mon besoin principal de faire cela n'était pas pour enregistrer les données dans le presse-papiers de Windows. C'est la raison pour laquelle je devais simuler Ctrl + C et ne pas l'utiliser. :) Avez-vous une idée où je vais mal dans mon code ci-dessus. – Anand

1

Je suis assez sûr Parole ne va pas répondre à EM_ messages. Ces messages sont spécifiques aux contrôles d'édition Windows; il arrive juste que Notepad utilise un contrôle d'édition ordinaire pour son texte.

Vous pouvez obtenir ce que vous voulez en utilisant les interfaces d'automatisation Word COM. Il n'y a aucun moyen garanti à 100% pour récupérer du texte d'une autre application.

Éditer: Je ne suis pas un expert sur ce sujet, mais vous pourriez avoir plus de succès avec les API d'accessibilité. Il est possible pour une application (telle que le Bloc-notes ou Word) d'exposer un ensemble d'objets représentant son interface utilisateur que vous pouvez interroger à partir de votre application.

+0

Voici ce que j'essaie: Depuis la fenêtre active j'ai besoin de copier le texte qui a été sélectionné. puis analyser ce texte pour faire quelque chose dans mon service. oui vous avez raison cela fonctionne très bien sur tout contrôle d'édition ordinaire. – Anand

+0

OK, soit l'API d'automatisation de Word ou les API d'accessibilité plus générales serait le chemin à parcourir. –