2009-12-07 2 views
1

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

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

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

+0

Вы хотите имитировать нажатие клавиши или Копирование данных? – Benny

+0

Нет, я просто хочу скопировать данные из другого окна. Без использования CTRL + C, вместо этого вышесказанное. – Anand

+0

Я не могу поверить, что кто-то проголосовал за этот вопрос, и есть более 1K взглядов на него !! .. – Anand

ответ

3
+0

это может быть! спасибо, позвольте мне проверить это. на самом деле я получил базовый код с этого сайта – Anand

+0

Привет, это сработало нормально, но я полностью забыл о своей основной необходимости в том, чтобы не сохранять данные в буфере обмена Windows. вот почему мне нужно было симулировать Ctrl + c и не использовать его. :) – Anand

+1

скопируйте содержимое буфера обмена, смоделируйте Ctrl + c, прочитайте снова и восстановите оригинал. –

1

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

Copy

Clipboard.SetText(txtClipboard.Text); 

Паста

txtClipboard.Text = Clipboard.GetText(); 

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

+0

ya с помощью Clipboard легко, но я хочу скопировать текст без использования CTRL + C, пытаюсь имитировать его - не использовать. Поэтому буфер обмена будет пустым. – Anand

+0

Хороший комментарий priyank помог вызвать в этой ссылке они отправляют сообщение для имитации ctrc + c, а затем я мог бы использовать объект буфера обмена, например, u предложил .. спасибо – Anand

+0

priyanks comment работал отлично, но я полностью забыл, что моя главная потребность в этом не была для сохранения данных в буфере обмена Windows. вот почему мне нужно было симулировать Ctrl + c и не использовать его. :) У вас есть идея, когда iam ошибается в моем коде выше. – Anand

1

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

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

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

+0

вот что я пытаюсь: из активного окна мне нужно скопировать текст, который был выбран. затем проанализируйте этот текст, чтобы что-то сделать в моем сервисе. Да, вы правы, это отлично работает на любом обычном элементе управления. – Anand

+0

ОК, либо API для автоматизации Word, либо более универсальные API-интерфейсы доступности. –

Смежные вопросы