Как я могу имитировать CTRL + C в C # - PullRequest
1 голос
/ 07 декабря 2009

У меня есть следующий код, который отлично работает в блокноте, но не в 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);
        }

к сожалению, вышеприведенное возвращает «{Microsoft Word Document}» при выделении текста в WORD или любом «richtextbox». Как это делает CTRL + C?

ПРИМЕЧАНИЕ. Это прекрасно работает в блокноте или любом простом текстовом редакторе.

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009
1 голос
/ 07 декабря 2009

Я почти уверен, что Word не будет отвечать на EM_ сообщения. Эти сообщения относятся к элементам редактирования Windows; Просто так получилось, что Блокнот использует простой текстовый элемент управления для своего текста.

Вы можете достичь желаемого с помощью интерфейсов автоматизации Word COM. Не существует 100% гарантированного способа извлечения текста из другого приложения.

Редактировать: Я не эксперт в этом, но вы могли бы добиться большего успеха с API доступа. Для приложения (такого как Блокнот или Word) возможно предоставить набор объектов, представляющих его пользовательский интерфейс, который вы можете запросить из своего приложения.

1 голос
/ 07 декабря 2009

Я думаю, вам следует изучить этот урок по C # Буфер обмена Копирование и вставка . Использование Copy paste в C # на самом деле не так сложно, как вы думаете.

Copy

Clipboard.SetText(txtClipboard.Text);

Paste

txtClipboard.Text = Clipboard.GetText();

Проверьте ссылку выше для получения дополнительной информации и примеров. Вам также следует обратиться на страницу MSDN для Clipboard.

...