2015-10-13 3 views
-1

Я уже реализовал приложение, которое может получить выделенный текст, эмулируя ctr + c keypress.Функция или библиотека, которая помогает получить выделенный текст из разных приложений

Итак, теперь у меня есть 3 методы работы:

// Using InputSimulator library 
    private static void CtrlC_inputSimulator() 
    { 
     var hWnd = GetWindowUnderCursor(); 
     SetActiveWindow(hWnd); 

     InputSimulator i = new InputSimulator(); 
     i.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C); 
    } 

    // Using SendKey 
    private static void CtrlC_SendKey() 
    { 
     try 
     { 
      SendKeys.Send("^(c)"); 
     } 
     catch(Exception ex) { } 
    } 

    // Using native user32 keybd_event directly 
    private void CtrlC_KeybdEvent_User32() 
    { 
     uint KEYBD_EVENT_KEYUP = 2; 

     var hWnd = GetWindowUnderCursor(); 
     SetForegroundWindow(hWnd); 

     // Ctrl-C Down 
     keybd_event(KEY_CONTROL, 0, 0, 0); 
     keybd_event(KEY_C, 0, 0, 0); 
     // Ctrl-C Up 
     keybd_event(KEY_C, 0, KEYBD_EVENT_KEYUP, 0); 
     keybd_event(KEY_CONTROL, 0, KEYBD_EVENT_KEYUP, 0); 
    } 

Но на практике это не стабильный способ использования моделирования нажатие.

И я подумал о том, как получить выделенный текст с помощью системных сообщений, таких как WM_GETTEXT, но насколько я знаю, большинство из этих вещей работают только с большим текстовым полем и не будут работать в таких программах, как Chrome или Acrobat Reader.

Скажите, пожалуйста, есть ли функция или какая-нибудь библиотека, чем это можно сделать?

+3

UI Automation .. –

+0

Он будет работать даже с выбором в браузере? – Letfar

+0

Кроме того, это ненадежно, вы также сбрасываете буфер обмена. То, что входит в буфер обмена, должно находиться под контролем * users *, а не с вашим приложением. –

ответ

-1
// Using native user32 Copy Message 
private void User32_Copy() 
{ 
    uint WM_COPY = 0x0301; 

    var hWnd = GetWindowUnderCursor(); 
    // SetForegroundWindow(hWnd); 

    SendMessage(hWnd,WM_COPY,0,0); 
} 
+0

Вызов 'SendMessage' с дескриптором окна, который находится вне вашего контроля, является ошибкой. Всегда используйте [SendMessageTimeout] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952.aspx) в подобном сценарии. Я не понимаю прокомментированную строку с вызовом 'SetForegroundWindow'. В чем смысл этого? – IInspectable

+0

@Инспективный, да действительно, SendMessage отправит и ждет ответа, его друг PostMessage отправит «n Забыть». эти функции являются наиболее распространенными и удобными в использовании. SendMessageTimeout менее распространен и является решением, когда риск SendMessage блокируется в ожидании сообщения, на которое требуется много времени, чтобы ответить. но SendMessage никогда не считался ошибкой. если вы так думаете, сообщите нам ссылку от Microsoft, которая говорит это. – milevyo

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

  • Нет связанных вопросов^_^