Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483

Как имитировать нажатие клавиш Ctrl+C

08.06.2020, 12:52. Показов 2812. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Задача такая,при нажатии своей кнопки Button1 выделенный текст в стороннем приложении(например Блокнот) копируется в буфер обмена,А при нажатии Button2 вставляется в стороннее приложение из БО.
Перепробовал много вариантов с этого форума,но ничего не работает И часто появляется такая ошибка,причем при вызове разных функций.
Миниатюры
Как имитировать нажатие клавиш Ctrl+C  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.06.2020, 12:52
Ответы с готовыми решениями:

Как описать нажатие клавиш Ctrl+Enter?
Здравствуйте. Подскажите пожалуйста как написать код, который определял бы нажатие одновременно клавиш Ctrl+Enter? Вот этот код не...

Как имитировать нажатия клавиш
Вот например программа должна нажимать клавиши например: Q и подержать сек 5 потом W с подержать сек 8 и так далее

Как отловить в своей программе нажатие CTRL + F
SoftIce, Я перевожу свою программу на vb10 и у меня возникли проблемы с переводом. Точнее с переменными. Подскажите пожалуйста как их...

17
263 / 215 / 53
Регистрация: 01.08.2016
Сообщений: 829
08.06.2020, 14:10
Тим70, По сути вопрос состоит как записать информацию в буфер обмена с помощью кнопки если я правильно понял:
https://docs.microsoft.com/ru-... -clipboard
0
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
09.06.2020, 00:02  [ТС]
andrsh,Да я с этого и начил.Только ни чего не получается...Даже в свою форму.Видимо нужно играть все таки с сочетания клавишь.
0
 Аватар для diadiavova
7253 / 2601 / 742
Регистрация: 11.04.2015
Сообщений: 4,136
Записей в блоге: 43
09.06.2020, 08:15
Лучший ответ Сообщение было отмечено Тим70 как решение

Решение

Цитата Сообщение от Тим70 Посмотреть сообщение
при нажатии своей кнопки Button1 выделенный текст в стороннем приложении(например Блокнот) копируется в буфер обмена,А при нажатии Button2 вставляется в стороннее приложение из БО.
В принципе-то вроде как ничего сложно и нет. Есть такая штука как
Keyboard.SendKeys Метод (Microsoft.VisualBasic.Devices) | Microsoft Docs
Ну или
SendKeys.Send(String) Метод (System.Windows.Forms) | Microsoft Docs
Таблицу сочетаний клавиш лучше читать на английском ))
Так что, все вроде просто, отправляешь ^c - копирует, отправляешь ^v - вставляет. Проблема только в том, что и копируется и вставляется все это дело только тогда, когда соответствующее окно активно и фокус именно на том элементе управления, с которым нужно провести данную манипуляцию (копирование или вставку). И если со своим приложением это сделать несложно, то с внешним - все совсем не так просто. Обычно для этого используются либо WinApi, либо UIAutomation. Приведу простой пример с UIAutomation.
Сначала к проекту подключаем библиотеки UIAutomationClient.dll и UIAutomationTypes.dll. Это стандартные библиотеки, входят во фреймворк с версии 3.5 кажись.
Далее импортируем
VB.NET Скопировано
1
Imports System.Windows.Automation
По поводу поиска окна: есть разные способы это сделать, например можно найти по имени класса, но тут вопрос в том, как его узнать. В студии есть такой инструмент, называется Spy++. Его можно найти в меню Средства. Там можно поискать среди открытых окон, найти то что надо и получить сведения, включая имя класса. Например мы работаем с блокнотом. Из Spy++ несложно узнать, что имя класса окна в нем называется Notepad, а имя класса текстового поля - Edit. Допустим у нас открыт блокнот с текстом, в тексте некоторая часть выделена. Делаем так
VB.NET Скопировано
1
2
3
4
        Dim classNotepadCondition As New PropertyCondition(AutomationElement.ClassNameProperty, "Notepad", PropertyConditionFlags.IgnoreCase)
        Dim notepad = AutomationElement.RootElement.FindFirst(TreeScope.Children, classNotepadCondition)
        Dim editCondition = New PropertyCondition(AutomationElement.ClassNameProperty, "Edit")
        Dim edit = notepad.FindFirst(TreeScope.Descendants, editCondition)
В результате мы получили ссылку на текстовое поле блокнота. Правда, учитывая, что для поиска мы использовали метод FindFirst, тут могут быть проблемы, если открыто несколько окон блокнота. Можно в этом случае идентифицировать окна, скажем по тексту. Чтобы получить текст из текстового поля можно сделать так
VB.NET Скопировано
1
2
3
        Dim textptn = CType(edit.GetCurrentPattern(TextPattern.Pattern), TextPattern)
        Dim selection = textptn.GetSelection()(0)
        Dim selectedtext = selection.GetText(1000)
Здесь textptn также имеет метод GetText и тоже принимает максимальное количество символов для чтения, так что если нужно получить весь текст, то надо использовать его, а если только выделенный, то так, как показано.
Собственно дальше, для того чтобы активировать окно и элемент управления можно сделать так
VB.NET Скопировано
1
edit.SetFocus()
После чего отправить сочетание клавиш для копирования, если нужно именно копировать в буфер. Если просто нужно прочитать текст, то это уже выше показал.
VB.NET Скопировано
1
SendKeys.SendWait("^c")
Теперь, допустим, скопированное мы хотим в другое окно блокнота запихнуть, причем это окно мы как раз сами и откроем.
VB.NET Скопировано
1
2
        Dim proc = Process.Start("NOTEPAD")
        Threading.Thread.Sleep(1000)
Подождать нужно для того, чтобы процесс успел запуститься, иначе получим исключение.
Теперь нам снова надо искать окно блокнота, но уже другое. Для этого мы используем помимо поиска по классу еще и используем то, что у запущенного нами процесса мы можем получить его идентификатор и добавим это условие к условию, использованному ранее
VB.NET Скопировано
1
2
3
4
5
6
7
        Dim idNotepadCondition As New PropertyCondition(AutomationElement.ProcessIdProperty, proc.Id)
        Dim targetcondition = New AndCondition(idNotepadCondition, classNotepadCondition)
        Dim notepad2 = AutomationElement.RootElement.FindFirst(TreeScope.Children, targetcondition)
        Dim edit2Condition = New PropertyCondition(AutomationElement.ClassNameProperty, "Edit")
        Dim edit2 = notepad2.FindFirst(TreeScope.Descendants, edit2Condition)
        edit2.SetFocus()
        My.Computer.Keyboard.SendKeys("^v")
Здесь еще следует добавить, что для вставки текста в текстовое поле, иногда можно использовать паттерн ValuePattern, но он не всеми контролами поддерживается. К сожалению Edit его не поддерживает, поэтому отправка сообщений о нажатиях клавиш здесь, по всей видимости единственно возможный вариант. Код целиком, там есть закомментированные фрагменты как раз касаются поддерживаемых контролом паттернов и работы с вальюпаттерном, которая в данном случае не подходит, но ты ведь не с блокнотом работать собираешься, так что надо проверить, будет ли это работать там, если это нужно, конечно.
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Imports System.Windows.Automation
 
Public Class Form1
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim classNotepadCondition As New PropertyCondition(AutomationElement.ClassNameProperty, "Notepad", PropertyConditionFlags.IgnoreCase)
        Dim notepad = AutomationElement.RootElement.FindFirst(TreeScope.Children, classNotepadCondition)
        Dim editCondition = New PropertyCondition(AutomationElement.ClassNameProperty, "Edit")
        Dim edit = notepad.FindFirst(TreeScope.Descendants, editCondition)
        Dim textptn = CType(edit.GetCurrentPattern(TextPattern.Pattern), TextPattern)
        Dim selection = textptn.GetSelection()(0)
        Dim selectedtext = selection.GetText(1000)
        edit.SetFocus()
        'SendKeys.Send(selectedtext + selectedtext)
 
        SendKeys.SendWait("^c")
 
 
        Dim proc = Process.Start("NOTEPAD")
        Threading.Thread.Sleep(1000)
        Dim idNotepadCondition As New PropertyCondition(AutomationElement.ProcessIdProperty, proc.Id)
        Dim targetcondition = New AndCondition(idNotepadCondition, classNotepadCondition)
        Dim notepad2 = AutomationElement.RootElement.FindFirst(TreeScope.Children, targetcondition)
        Dim edit2Condition = New PropertyCondition(AutomationElement.ClassNameProperty, "Edit")
        Dim edit2 = notepad2.FindFirst(TreeScope.Descendants, edit2Condition)
        edit2.SetFocus()
        My.Computer.Keyboard.SendKeys("^v")
 
 
        'Dim patterns = String.Join(vbNewLine, edit.GetSupportedPatterns().Select(Function(ap) ap.ProgrammaticName))
        'MsgBox(patterns)
        'Dim vpat As ValuePattern = edit.GetCurrentPattern(ValuePattern.Pattern)
        'vpat.SetValue(selectedtext + selectedtext)
    End Sub
End Class
8
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
16.06.2020, 12:10  [ТС]
diadiavova, Спасибо,очень подробно.Попробую позже
0
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
22.06.2020, 12:03  [ТС]
diadiavova, Извините,но в этой строке возникает ошибка
VB.NET Скопировано
1
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
0
 Аватар для diadiavova
7253 / 2601 / 742
Регистрация: 11.04.2015
Сообщений: 4,136
Записей в блоге: 43
22.06.2020, 12:06
Тим70, ну ясно же, что для того, чттбы подписаться на событие Button1, надо чтобы такая кнопка была на форме.
0
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
22.06.2020, 12:11  [ТС]
Такая,снимал данные с помощью программы,возможны ошибки.

Добавлено через 2 минуты
diadiavova, Так кнопка и есть .И именно Button1.Ну я же не совсем ку-ку
0
 Аватар для diadiavova
7253 / 2601 / 742
Регистрация: 11.04.2015
Сообщений: 4,136
Записей в блоге: 43
22.06.2020, 12:13
Тим70, ну, а какие ещё ошибки могут быть в этой строке? Ну и о самой ошибке информацию тоже надо давать.
0
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
22.06.2020, 12:15  [ТС]
Для предложения "Напсііез" требуется переменная с Р
модификатором "\МітЬЕчепіз", определенная во вмещающем
типе или в одном из его базовых типов.

Добавлено через 1 минуту
diadiavova, Вот ,извиняюсь,сразу не дал.
0
 Аватар для diadiavova
7253 / 2601 / 742
Регистрация: 11.04.2015
Сообщений: 4,136
Записей в блоге: 43
22.06.2020, 12:21
Тим70, предложение, по всей видииости Handles, а не то, что написано, остального вообще не понял. Сообщение провитано с помощью OCR-системы что ли?
0
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
22.06.2020, 12:23  [ТС]
diadiavova, Еще раз повторяю,снимал текст с переводчика,возможно ошибки
0
 Аватар для diadiavova
7253 / 2601 / 742
Регистрация: 11.04.2015
Сообщений: 4,136
Записей в блоге: 43
22.06.2020, 12:29
Тим70, а без переводчика можно увидеть?

Добавлено через 3 минуты
Тим70, короче, просто нужно на форму добавить кнопку, клацнуть по ней дважды, и в обработчик вставить код.
0
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
22.06.2020, 12:30  [ТС]
diadiavova, С помощью этого Capture2Text,ошибок выдает кучу,но лучшего пока не нашел снимать текст с экрана.
0
 Аватар для diadiavova
7253 / 2601 / 742
Регистрация: 11.04.2015
Сообщений: 4,136
Записей в блоге: 43
22.06.2020, 12:34
Тим70, а скопировать, никак? Я чуть позже найду проект и выложу.
0
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
22.06.2020, 13:07  [ТС]
diadiavova, Да я все так и сделал,после первой ошибки,несколько дней назад,но сейчас выскочила другая....
Миниатюры
Как имитировать нажатие клавиш Ctrl+C   Как имитировать нажатие клавиш Ctrl+C  
0
 Аватар для diadiavova
7253 / 2601 / 742
Регистрация: 11.04.2015
Сообщений: 4,136
Записей в блоге: 43
22.06.2020, 13:16
Тим70, ну, раз программа не нашла окна блокнота, значит его там не было. Ты все выполнил, что было написано? Нужно открыть окно блокнота, ввести туда какой-то текст, часть текста выделить, после этого переходить к программе и жать кнопку.
На всякий случай выкладываю проект. Там еще одна кнопка, выводит заголовки всех открытых окон. Ну так, если надо все окна найти.
И еще, те окошки, что показываются с сообщениями об ошибках, там в самом низу есть ссылочка "Скопировать сведения исключения в буфер обмена". А если ошибка во время разработки возникла, то она в окошке "Список ошибок" есть, оттуда ее тоже скопировать можно.
Вложения
Тип файла: zip CopyOuterText.zip (171.6 Кб, 8 просмотров)
1
Любитель
 Аватар для Тим70
1023 / 722 / 158
Регистрация: 27.01.2019
Сообщений: 1,483
22.06.2020, 16:48  [ТС]
diadiavova, Ну вообшем да ,так и получается.Открываю свой блокнот,чтото копирую в нем ,а потом перехожу в параллейный блокнт,чтобы туда скопировать запись.

Добавлено через 6 минут
diadiavova, Да.Тут скорее моя ошибка,а не ваша,буду потихоньку разбираться.

Добавлено через 38 секунд
diadiavova, Да.Тут скорее моя ошибка,а не ваша,буду потихоньку разбираться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.06.2020, 16:48
Помогаю со студенческими работами здесь

Нажатие клавиш вне формы (глобальный перехват сочетания клавиш)
Всем доброго времени суток! Задумал сделать значок раскладки клавы, но беда в том, что если потерян фокус приложения, то значок не...

Как запретить нажатие клавиш?
Как запретить нажатие клавиш?

Как определить нажатие клавиш, даже когда окно не активно
Привет, помогите плиз. Как в VB 2010 считывать нажатие клавиш, даже когда окно VB не активно, допустим когда играю или что нибудь набираю в...

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

Как имитировать нажатие клавиш внутри формы c#
Мне надо имитировать нажатие клавиши. Я пробовал в таймере вызывать класс SendKeys.SendWait("{TAB}"); Но если я переведу фокус на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи будет иметь приблизительный результат вычисления для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу можно будет корректировать по ходу. Это потому что прямое соотношение. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
TypeScript vs JavaScript: Отличия и когда что использовать
Reangularity 09.04.2025
JavaScript появился в 1995 году как творение Брендана Эйха и быстро стал основой интерактивности в вебе. За свою историю он прошел путь от простого языка для манипуляций с DOM до полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер