Захват в клипборд без использования клавиатуры

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Захват в клипборд без использования клавиатуры

Сообщение giaber » 19.03.2015 (Чт) 18:50

Задача - захват в клипборд текста или картинки без использования клавитауры, ипользуя только мышь. Как например в программе DragKing.
Для отслеживания мышиных событий взял код уважаемого The trick:
' Модуль для перехвата событий ввода мыши и клавиатуры
' © Кривоус Анатолий Анатольевич (The trick), 2014

Код: Выделить всё
Private Function LowLevelMouseProc(ByVal uCode As Long, ByVal wParam As Long, lParam As MSLLHOOKSTRUCT) As Long
        If uCode = HC_ACTION Then
                Select Case wParam
                                '
                        Case WM_LBUTTONDOWN
                                remX = lParam.pt.x 'запоминаем положение курсора мыши (Х-координату)
                                '
                        Case WM_LBUTTONUP
                                If remX <> lParam.pt.x Then ' если координаты Х при нажатии и отжатии не совпадают, значит
                                                                           ' или это просто отдельный клик, не проблема-в клипборд ничего не пойдёт
                                                                           ' или что-то было отмечено, и тогда отмеченное забираем в клипборд:
                                        '
                                        Call keybd_event(VK_CONTROL, 0, 0, 0) 'эмулируем нажатие клавиши Ctrl
                                        Call keybd_event(VK_C, 0, 0, 0) 'эмулируем нажатие клавиши C
                                        Call keybd_event(VK_C, 0, KEYEVENTF_KEYUP, 0) 'эмулируем отжатие клавиши C
                                        Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) 'эмулируем отжатие клавиши Ctrl
                                        '
                                        Sleep 50
                                        If Clipboard.GetFormat(vbCFText) Then frmMain.Text1.Text = Clipboard.GetText
                                End If
                End Select
        End If
        LowLevelMouseProc = CallNextHookEx(hMouseHook, uCode, wParam, lParam)
End Function


проблема-в Text1 текст не появляется, хотя в клипборде этот текст есть - через Ctrl+V он пастится в блокнот.
если же я цепляю
Код: Выделить всё
If Clipboard.GetFormat(vbCFText) Then frmMain.Text1.Text = Clipboard.GetText
на отдельный button, всё прекрасно работает - текст появляется в Text1

в чём я туплю?

и вообще, даже если это заработает - наверное, эмулировать нажатие клавиш - не лучший вариант. А что есть лучше?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 19.03.2015 (Чт) 19:37

giaber писал(а):в чём я туплю?

Действия выполняются асинхронно. Представь 3 потока:
1: говорит 2: обработай нажатие ctrl
2: ага, клавиши.. ща подумаю...
1: говорит 2: обработай нажатие следующей клавиши
...
1: посплю 50 мс
1: давай текст из буфера
3: теперь в буфере есть текст
По крайней мере, я так думаю.

Кстати, в некоторых случаях даже при ручном копировании задержка достаточно ощутима, чтобы успеть попытаться вставить из пустого буфера. А Adobe reader вроде даже прогрессбар показывает при копировании больших объёмов.

giaber писал(а):и вообще, даже если это заработает - наверное, эмулировать нажатие клавиш - не лучший вариант. А что есть лучше?

Спорный момент. Почитай.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Захват в клипборд без использования клавиатуры

Сообщение giaber » 19.03.2015 (Чт) 19:48

Действия выполняются асинхронно

а как это обойти, чтоб получалось?

увеличил задоржку - появляется текст с предыдущего захвата

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 19.03.2015 (Чт) 19:58

giaber писал(а):а как это обойти, чтоб получалось?

Обрабатывать событие изменение текста в буфере, вероятно.
И вместо таймаута просто вешать соответствующий обработчик, а потом (из самого обработчика) его снимать.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Захват в клипборд без использования клавиатуры

Сообщение giaber » 19.03.2015 (Чт) 21:41

А не могли бы вы чуть конкретней объяснить?
Обрабатывать событие изменение текста в буфере
- это как? Хоть куда копать, подскажите.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Захват в клипборд без использования клавиатуры

Сообщение Хакер » 19.03.2015 (Чт) 21:42

Я не знаю, что такое DragKing. Можно объяснить?

Если цель — создать снаппер/граббер текста, то делать это надо вообще по другому.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 19.03.2015 (Чт) 21:45

Сначала в Гугл
Код: Выделить всё
clipboard events
clipboard events winapi
clipboard events C#
потом сюда:
SetClipboardViewer

Неужели лень 1 минуту на поиски потратить???

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Захват в клипборд без использования клавиатуры

Сообщение giaber » 19.03.2015 (Чт) 22:49

2 Хакер
В броузере (как минимум) заинтересовал какойто текст. Нажимаем ЛКМ не отпуская двигаем мышь до нужного места. Текст выделяется. При отпускании
ЛКМ выделенный текст должен оказаться в клипборде и затем отразиться в текстбоксе. Аналогично с рисунками. Это минимум желания. В идеале при выделении и текста и рисунков вместе, рисунки отображаются в соответствующих PictureBox-ах а текст - в текст боксах

Qwertiy
Неужели лень 1 минуту на поиски потратить???

поверьте, я давно отучился бросаться на VB форумы при первом же возникновении проблемы. Я понимаю что трудно поверить, но этой , например, конретной темой я занимаюсь уже 4й день и только сейчас обратился к вам за помощью. Тупой? Вероятней всего. Но лентяй и халявщик? Ни в коем случае! Вот, провёл ревизию - по этой теме скачано 16 примеров работы с клипбордом, 29 блоков текстов с форумов и сайтов про клипборд, но ничего всё равно не понятно - приходится спрашивать здесь.Видимо не так искал - SetClipboardViewer первый раз слышу. Видимо увидев слово Viewer подсознательно думал что речь идёт о готовой программе и поэтому отбрасывал.
Так что про тупость мою - пожалуйста, сколько угодно, но халявщиком обзывать - позвольте вам не позволить, как говорится.
clipboard events - смотрел, пока ничего не понял
clipboard events winapi - не догадался winapi приписать, ну тупой, говорю же!
clipboard events C# - и сейчас не буду смотреть - ни хрена не понимаю в этих сишных текстах

но за помощь спасибо

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Захват в клипборд без использования клавиатуры

Сообщение Хакер » 19.03.2015 (Чт) 23:05

giaber писал(а):броузере (как минимум) заинтересовал какойто текст.

То есть обвести мышкой окно калькулятора или какой-нибудь диалог «О программе» и получить его текстовое содержимое в буфере обмена — это не то, что требуется?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Захват в клипборд без использования клавиатуры

Сообщение giaber » 20.03.2015 (Пт) 8:27

2Хакер
Нет,нет! Только как облегчение сбора информации при сёрфинге в инете, то есть делаю Клипборд-Менеджер с историей, но под себя заточеный. У меня требования сложились такие - гуляю по страницам, опа! вот инфа по Теме1 - мышку к краю экрана-->выплыла панель КМ--> кликнул на TabStrip-е на Tab "Тема1 "-->отметил мышкой заинтересовавший блок текста или рисунок-->пошло в клипборд а оттуда в КМ, все последующие блоки текста будут фиксироваться на Tab-е "Тема1 " уже без необходимость вывода панели, пока не встретится инфа по Тема2 - тогда опять надо вывести панель и активизировать соответствующий таб. После окончания серфинга каждому куску текста или рисунку можно присвоить порядковый номер и КМ соберёт все отмеченые тексты и рисунки в единый документ (doc? pdf? rtf?) в котором рисунки и тексты идут в том порядке, который был указан.

А то, что вы описываете - тоже нужно, конечно, как дополнительная возможность, но её я решил реализовать используя OCR-ный контрол Kleptomania от Structurise, работает неплохо, и цена совершенно приемлимая - 20 баксов (не сочтите за рекламу)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Захват в клипборд без использования клавиатуры

Сообщение alibek » 20.03.2015 (Пт) 8:49

Хакер писал(а):То есть обвести мышкой окно калькулятора или какой-нибудь диалог «О программе» и получить его текстовое содержимое в буфере обмена — это не то, что требуется?

Это где такие трики работают?
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Захват в клипборд без использования клавиатуры

Сообщение Хакер » 20.03.2015 (Пт) 10:15

alibek писал(а):Это где такие трики работают?

Да тот же SnagIt.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.03.2015 (Пт) 11:49

giaber писал(а):clipboard events - смотрел, пока ничего не понял
clipboard events winapi - не догадался winapi приписать, ну тупой, говорю же!
clipboard events C# - и сейчас не буду смотреть - ни хрена не понимаю в этих сишных текстах

1. Да. Там что-то в основном про web.
2. Часто приписывать надо.
3. Ну и зря. Надо понимать как найти нужное winapi в коде на C#.

giaber писал(а):Я понимаю что трудно поверить, но этой , например, конретной темой я занимаюсь уже 4й день и только сейчас обратился к вам за помощью.

Я не про тему говорил, а про конкретный вопрос.
Вопрос через полтора часа после моего поста про события (хотя это вообще не важно). Мой поиск в гугле вместе с написанием ответа (и вместе со временем, которое вопрос оставался незамеченным) занял 4 минуты - в большинстве случаев это говорит о том, что спрашивающий не слишком-то и искал. Хотя, по clipboard events действительно не то ищется.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Захват в клипборд без использования клавиатуры

Сообщение giaber » 20.03.2015 (Пт) 17:50

Вопрос через полтора часа после моего поста про события

Я, к сожалению, не профессиональный програмист и бейсиком занимаюсь урывками, выкраивая для этого немного времени в суете многих других дел, поэтому не считаю большой виной 1,5 часовое опоздание с ответом. Вот, я вообще после вчерашнего только сутки спустя смог зайти на форум - ну что я сделаю, очень закручен повседневными делами.

Мой поиск в гугле ... занял 4 минуты

Но ответа и вы не нашли. Или знаете ответ? Тогда пожалейте меня и подскажите. По поиску с посоветованными вами ключевыми словами всё равно я ничего не смог найти

Ладно, оставим "беспощадные разборки в Бронксе" :), а то меня за оффтоп ... Возвратимся к теме. Я так ничего и не нашёл, что позволило бы мне решить проблему. Подскажите, мужики!
То есть проблема сейчас в том что, в текстбоксе отражается прошлый захват текста. Сделал 10 сек паузу - всё равно так же.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Захват в клипборд без использования клавиатуры

Сообщение Хакер » 20.03.2015 (Пт) 18:17

Qwertiy писал(а):3. Ну и зря. Надо понимать как найти нужное winapi в коде на C#.

Qwerty, зачем ты в очередной раз пизаешь дотнет туда, где, казалось бы, нет повода его упоминать? Ты это делаешь систематически и планомерно, я уже давно замечаю. Незаметно, ненавязчиво, но так или иначе вставляешь упоминание.

Какой смысл искать работу с WinAPI через C#, который использует фреймворк, идея которого состоит в том, чтобы обернуть как можно больше API?

Лучшие примеры, лучшие куски кода и просто наиболее распространнённые примеры — это использование WinAPI из C и С++. Но не из Си-шарпа.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.03.2015 (Пт) 23:51

giaber писал(а):поэтому не считаю большой виной 1,5 часовое опоздание с ответом

Во-первых, я такого не говорил. Я наоборот имел в виду, что задержка похожа на "увидел и сразу переспросил", но при этом явно указал, что дело не в этом, а в том, что у меня поиск занял 1 минуту, вместе с ответом - 4.
Ладно, заканчиваем с этой темой.

giaber писал(а):Я так ничего и не нашёл, что позволило бы мне решить проблему.

Ссылка на msdn, которую я дал в конце поста разве не является ответом? Я думал, что да.

Хакер писал(а):Qwerty

Хакер, зачем ты постоянно неправильно пишешь мой ник? Буква i в нём не просто так.

Хакер писал(а):Какой смысл искать работу с WinAPI через C#, который ...

Стоп. Смысл не в поиске C# и не в поиске того, как работать с winapi.
Идея в том, что такое автодополнение даже гугл предлагает, т. е. вопросов таких много, ответов тоже. А смысл - это просто узнать, какие вообще функции могут быть для этого использованы. А дальше уже искать сами функции.

Хакер писал(а):Лучшие примеры, лучшие куски кода и просто наиболее распространнённые примеры — это использование WinAPI из C и С++.

Примеры - да. А чтобы просто узнать, как функция называется, лучший пример не нужен, нужен любой пример.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Re: Захват в клипборд без использования клавиатуры

Сообщение Qwertiy » 21.03.2015 (Сб) 0:02

Уточнение. С той ссылки сюда: Monitoring Clipboard Contents.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Захват в клипборд без использования клавиатуры

Сообщение Хакер » 21.03.2015 (Сб) 0:10

Qwertiy писал(а):Хакер, зачем ты постоянно неправильно пишешь мой ник? Буква i в нём не просто так.


Автоматическая подсистема исправления опечаток в составе моего мозга делает это подсознательно, я ничего не могу с этим поделать, хочу написать одно, а руки пишут более привычную комбинацию.

Qwertiy писал(а):Стоп. Смысл не в поиске C# и не в поиске того, как работать с winapi. . А смысл - это просто узнать, какие вообще функции могут быть для этого использованы.

У MSDN давно сложился шаблон организации: если есть XXX, то будет About XXX, где доступно рассказывается, что вообще такое XXX, а дальше будет XXX Reference, где будут описаны функции/константы/структуры.

Вот и надо искать Clipboard reference: самый первый результат ведёт куда нужно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.03.2015 (Сб) 0:37

Хакер писал(а):У MSDN давно сложился шаблон организации: если есть XXX, то будет About XXX, где доступно рассказывается, что вообще такое XXX, а дальше будет XXX Reference, где будут описаны функции/константы/структуры.

Спасибо. Не знал.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Захват в клипборд без использования клавиатуры

Сообщение giaber » 21.03.2015 (Сб) 8:19

Посмотрел приведённые ссылки - в смысле. предварительно, чтоб оценить масштаб. Ну, уже ясно что абсолютно ничего не ясно там мне. Но конечно, если надо - потрачу месяц-другой, может что и пойму. Но вот что хочу спросить вас - я получу ответы на эти вопросы изучив то, что там написано?

1. Как поместить в Clipboard (CB) кусок выделенного в чужом окне текста, не используя эмуляцию нажатия Ctrl+C
2. Как поместить в Clipboard (CB) кусок выделенного в чужом окне рисунка, не используя эмуляцию нажатия Ctrl+C
3. Почему ипользуя:
Код: Выделить всё
If Clipboard.GetFormat(vbCFDIB) Then Picture1.Picture = Clipboard.GetData(vbCFDIB)
или:
If Clipboard.GetFormat(vbCFBitmap) Then Picture1.Picture = Clipboard.GetData(vbCFBitmap)

я не получаю в Picture1 рисунок скопированый при помощи Ctrl+C, а получаю только в том случае, если в контекстном меню при нажатии ПКМ на выделенном рисунке кликаю на "Copy Image", в то же время рисунок находится в CB, поскольку любое другое приложение его может получить-Ворд, Пейнт, Фотошоп и т.д
4. Как устроен этот CB - как копируется и пастируется блок, в котором есть и текст и рисунки и ссылки?

Если да, то тогда придётся потратить эту чёртову уйму времени. Хотя конечно обидно - в результате я узнаю несколько строчек кода, которые мог бы узнать от кого нибудь другого за 1 минуту
----------------
Вообще хотелось бы получить совет - какими путями правильней реализовать ту задачу, которую я описал, хотя бы общие направления, а то мне так не нравится эмуляция Ctrl+C!

ЗЫ
Как мониторить CB с помощью SetClipboardViewer я с вашей подачи разобрался, спасибо!

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Захват в клипборд без использования клавиатуры

Сообщение giaber » 21.03.2015 (Сб) 8:51

Скачал несколько готовых примеров Clipboard вьюверов. Там сделано то , о чём пишут в приведёных вами ссылках. Но везде одна проблема - рисунок, скопированый при помощи Ctrl+C не отображается,только в том случае, если в контекстном меню при нажатии ПКМ на выделенном рисунке кликаю на "Copy Image"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.03.2015 (Сб) 11:12

giaber писал(а):Но вот что хочу спросить вас - я получу ответы на эти вопросы изучив то, что там написано?

Не знаю.

giaber писал(а):Если да, то тогда придётся потратить эту чёртову уйму времени. Хотя конечно обидно - в результате я узнаю несколько строчек кода, которые мог бы узнать от кого нибудь другого за 1 минуту

Я такого не делал, так что не знаю. Есть следующие предположения:
1. Послать WM_COPY - для текстбоксов (не браузерных) сработовет, для остального надо проверять.
2. Так же.
3. Потому что в буфер помещается не картинка, а html.
4. Из браузера? Html. Вообще, ещё охапка других форматов - от стандартного rtf до специфических форматов разных программ.

giaber писал(а):Вообще хотелось бы получить совет - какими путями правильней реализовать ту задачу, которую я описал, хотя бы общие направления, а то мне так не нравится эмуляция Ctrl+C!

Если WM_COPY не сработает, то кроме отправки клавиш у меня идей нет.

giaber писал(а):Как мониторить CB с помощью SetClipboardViewer я с вашей подачи разобрался, спасибо!

Теперь вставляется правильный кусок?

giaber писал(а):Но везде одна проблема - рисунок, скопированый при помощи Ctrl+C не отображается,только в том случае, если в контекстном меню при нажатии ПКМ на выделенном рисунке кликаю на "Copy Image"

См. выше - пункт 3 и 4.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55

    TopList