Ayub Kokabi Ответов: 0

Как Скопировать текст из любого приложения в буфер обмена


Вот что я пытаюсь сделать,

Когда пользователь выбирает любой текст любого запущенного приложения левой кнопкой мыши и клавишей CRTL, выделенный текст должен быть скопирован в буфер обмена.

До сих пор я реализовал логику, используя глобальное нажатие клавиши для запуска комбинации клавиш клавиатуры CRT+ C для копирования выбранного слова в буфер обмена. Этот код работает правильно для Google Chrome, но я столкнулся с проблемой с блокнотом.

Что я уже пробовал:

private static void OnMouseLeftButtonUp(object sender, MouseEventArgs e)
    {
        if ((ModifierKeys & Keys.Control) == Keys.Control)
        {
            Thread.Sleep(1500);
            IntPtr hWnd = GetWindowUnderCursor();
            SetForegroundWindow(hWnd);
            Thread.Sleep(500);

            //Ctrl + C
            new InputSimulator().Keyboard. 
                .ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C);

            Thread.Sleep(500);
            MessageBox.Show(Clipboard.GetText());
        }
    }


Что здесь происходит?

Dave Kreskowiak

МММ.... Я вижу серьезный недостаток дизайна. Когда срабатывает событие MouseButtonUp, вы вызываете SendCTRL_C, в котором первое, что он делает, - это получает окно под курсором мыши, которое будет вашим приложением, а не отправляющим приложением.

Ayub Kokabi

Я улучшил код. обратите внимание, что мое приложение свернуто при запуске. Перед отправкой Ctrl + C я получаю дескриптор окна, курсор которого находится на нем. (GetWinowUnderCursor()). это может быть notepad, chrome, edge и т. д. Затем setforgroundwindow() устанавливает фокус на предыдущий hWnd (дескриптор окна).

Dave Kreskowiak

Предположим, что пользователь отпускает кнопку мыши, пока она находится в вашем окне, что произойдет в первую очередь?

Опять же, вы получаете окно под курсором мыши, которое будет вашим окном!!

Подумай!

Ayub Kokabi

Я намеренно упрощаю код. С другими проблемами я разберусь позже. Я хочу, чтобы вы сосредоточились на главной проблеме.

Выполнить следующие действия:
1 - Запустите приложение,
2 - Сделайте его минимизированным,
3 - Откройте Google Chrome,
4 - удерживайте клавишу Ctrl,
5 - перетащите некоторый текст на веб-страницу,
6 - теперь отпустите drag (LeftMouseButtonUp),
Результат: он показывает, что MessageBox содержит выбранный вами текст правильно.
Снова выполните эти действия в блокноте, но теперь он не показывает правильный выделенный текст.

Это моя главная проблема.
пожалуйста, сосредоточься на этом.

Dave Kreskowiak

Ладно, теперь я понимаю, что происходит. Вы используете неправильные термины. "Перетаскивание" обычно относится к перемещению объекта. В случае "перетаскивания" вы перетаскиваете выбранный объект через другое окно и бросаете его в это окно.

Вы должны заменить слово "перетаскивание" на "выбор".

Вот тут-то и возникает путаница.

Итак, вы хотите сказать целевому окну, чтобы оно скопировало выделенный текст в буфер обмена.

Ayub Kokabi

О Дэйв, ты абсолютно прав. Мой английский не очень хорош. Извините меня.
Я думаю, что нашел проблему. Прежде чем получить ручку окна, я должен был бы немного задержаться. Я обновил код, но новый вопрос: сколько секунд для задержки. Для меня это работает только в том случае, если у меня есть 1500 МС не меньше. А как насчет конечных пользователей? Это заставляет меня волноваться. У вас есть другие решения?

Dave Kreskowiak

То, что вы делаете, - это получаете ручку окна, над которым находится мышь, а затем отправляете в него свои сообщения. Это окно может быть не тем окном, в которое вы на самом деле должны отправить нажатия клавиш, чтобы получить их обработку. Возможно, вам придется взобраться на дерево окон, чтобы получить окно, которое будет знать, что делать с сообщениями, которые вы отправляете.

Я не есть какие-либо примеры этого.

Ayub Kokabi

Qtranslate-это пример. Скачивайте и тестируйте.
https://quest-app.appspot.com/

Richard MacCutchan

Почему бы просто не позволить системе сделать это? Практически каждое приложение позволяет выделить текст и скопировать его в буфер обмена с помощью пары щелчков мыши. Ваше приложение просто становится на пути.

Ayub Kokabi

Простота.
Хороший разработчик несет боль за комфорт пользователей.

Richard MacCutchan

Как это может быть проще, чем то, что уже предусмотрено (и работает без проблем) операционной системой?

Ayub Kokabi

Какой из них проще?
1. Удерживайте нажатой клавишу Ctrl и выделите текст -> смотрите результат
2. Скопировать текст, открыть приложение, прошлый текст в текстовое поле -и GT; посмотреть результат.

Richard MacCutchan

Ни. Все, что мне нужно сделать, это щелкнуть правой кнопкой мыши, перетащить ее на текст и нажать Ctrl+C или нажать кнопку "Копировать". Можно ли Скопировать текст из программы просмотра PDF, часть изображения, содержимое электронной таблицы Excel или документа Word без потери форматирования?

И несмотря на этот комментарий, вы все еще не показали свой код, который выполняет фактическое копирование.

Ayub Kokabi

Почти все словари, такие как babylon и Qtranslate, используют эту технику для копирования текста. Мне не нужно форматирование. Я понял, что в моем сценарии эта техника приведет к лучшей обратной связи.

Dave Kreskowiak

Выделите текст с помощью мыши и нажмите Ctrl-C. Сделано.

Это можно сделать одной рукой, а не двумя.

Ayub Kokabi

А как насчет двойного нажатия shift? Это можно сделать одним пальцем :)

Dave Kreskowiak

В вашей операции вы, кажется, должны удерживать CTRL при выборе с помощью мыши. Требуются две руки.

Ayub Kokabi

Если я изменю ярлык на двойное нажатие shift, ваша проблема будет решена? :)

BillWoodruff

показать код для kybd_event()

Ayub Kokabi

Я улучшил свой код. Я использовал эту библиотеку для sendinput:
https://archive.codeplex.com/?p=inputsimulator

BillWoodruff

и можете ли вы сделать то, что вы хотите сделать сейчас ?

Ayub Kokabi

- Нет! ещё нет.

Richard MacCutchan

Самая важная часть вашего кода все еще отсутствует: как вы выбираете текст и копируете его в буфер обмена?

0 Ответов