我怎样才能在C#中模拟CTRL + C

时间:2009-12-07 10:11:58

标签: c# richtextbox copy-paste

我有以下代码在记事本中工作正常但在WORD中没有工作!!

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

不幸的是,当在WORD或任何“richtextbox”中选择文本时,上面的内容会返回“{Microsoft Word Document}”。 CTRL + C如何做到这一点?

注意:这在记事本或任何简单的文本编辑器中都可以正常工作。

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

我认为您应该在C# Clipboard Copy and Pasting上查看本教程。在C#中使用复制粘贴实际上并不像你想象的那么难。

复制

Clipboard.SetText(txtClipboard.Text);

<强>粘贴

txtClipboard.Text = Clipboard.GetText();

查看上面的链接以获取更多信息和示例。您还应该查看Clipboard的{​​{3}}。

答案 2 :(得分:1)

我很确定Word不会回复EM_消息。这些消息特定于Windows编辑控件;只是记事本对其文本使用普通的编辑控件。

您可以使用Word COM自动化界面实现您想要的功能。没有100%保证从另一个应用程序检索文本的方法。

编辑:我不是这方面的专家,但您可以使用辅助功能API获得更多成功。应用程序(例如记事本或Word)可以显示一组表示其UI的对象,您可以从应用程序进行查询。