| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Как программно сделать копию экрана? |
| Автор: Дейв 10.2.2003, 19:50 |
| Подскажите, пожалуйста, как из программы можно сделать копию экрана. Операторы типа SendKeys в этом случае не работают. Может есть какие API-функции (желательно для VB). Или есть уже готовая программка для этих целей? |
| Автор: Гость_Small 11.3.2005, 23:08 |
| 1- Щелкните на клавиатуре по клавише Print Screen (копия экрана). 2- Перейдите в редактор Word: Пуск р Программы р Word (или щелкните по иконке Word на Рабочем Столе). 3- В окне редактора Word выполните команду: Правка [Edit] р Вставка [Paste] |
| Автор: Golden Hands 12.3.2005, 00:50 |
| Программы Snagit, Corel Capture предоставляют для этого очень большие возможности. P.S. Сорри, не посмотрел на раздел... |
| Автор: RA 12.3.2005, 08:12 |
| Одной функцией Api тут не обойдешся, а вообще тему нужно было создавать в соответвующем разделе (в разделе по VB). |
| Автор: Exception 12.3.2005, 11:57 | ||
| Программно? Где-то у меня примерчик лежал... Вот:
Каждые пять сек. этот код фоткает содержимое экрана и сохраняет в папке "C:\Bitmaps" Будут вопросы - обращайся. ЗЫ Зарегься - проще будет |
| Автор: cardinal 12.3.2005, 18:58 |
| http://forum.vingrad.ru/index.php?showtopic=6424 |
| Автор: Exception 13.3.2005, 14:21 |
| Только так в файле не сохранишь... В общем в зависимости от задачи |
| Автор: Flotskiy 15.3.2005, 10:35 |
| День добрый всем! Run-time error , меня заинтересовал твой код, если можешь - добавь, чтобы при запуске проги иконка сворачивалась в трей (к часикам). С уважением |
| Автор: Exception 15.3.2005, 15:57 | ||||||||||||||||||||||||
| Вот статейку нарыл: ----------------------------------------------------------------------------------------------------------------------------------------------- Эта статья является самодостаточной, то есть в ней дана исчерпывающая информация по созданию иконки в SystemTray с помощью VB. Однако при этом она является компиляцией общедоступных источников, то есть заслуга автора состоит лишь в сборе этой информации в одном месте и пояснениях. Основы создания иконки изложены в FAQ Льва Серебрякова. Используется пример на VB от Alexander Shherbakov. Описания функций и констант из книги Daniel Applemana и API.TXT. Вопросы связанные с редактором ресурсов не рассматриваются. Единственная функция для работы с иконкой Shell_NotifyIcon. Ее описание на VB выглядит так:
Возвращает ноль в случае ошибки Тип dwMess описывается так:
Переменная dwMessage должна иметь одно из этих значений. Тип NOTIFYICONDATA имеет следующую структуру:
Где тип uF имеет вид:
Эти константы можно применять в любых сочетаниях, для определения какой из параметров имеет значение. Тип CallMess:
Эти константы обозначают, какое событие возвращается вызывающей форме. Буквально, все, что будет происходить с иконкой, будет вызывать у формы одно из перечисленных событий. Ясно, что самое частое событие самой иконки это MouseMove, но для формы оно будет выглядеть как событие заданное переменной uCallbackMessage. Как же узнать, что в действительности произошло с иконкой? Это можно узнать через переменные X и Y событий MouseMove, MouseDown и MouseUp вызывающей формы. При этом Y, если событие произошло с иконкой, а не формой, всегда будет равно нулю, а X несет информацию о событии с иконкой. О параметре X следует сказать отдельно. Действительно, он передает информацию о событиях с иконкой, однако эти значения зависят от масштабного коэффициента системного шрифта, но не напрямую, а через параметр свойства TwipsPerPixelX объекта Screen. То есть для одной и той же системы, при разных величинах системного шрифта, значения будут разными. Начальными значениями событий являются следующие: MouseMove - 512 LeftButtonDown - 513 LeftButtonUp - 514 LeftButtonDblClick - 515 RightButtonDown - 516 RightButtonUp - 517 RightButtonDblClick - 518 Для того чтобы узнать действующие в данной системе значения их следует умножить на Screen.TwipsPerPixelX Как же узнать, что событие произошло с иконкой, а не с формой? Просто, по значению Y, равному нулю. Но есть и другой способ, если используется двухкнопочная мышь то параметр Button в событиях MouseDown и MouseUp формы, будет принимать значения 1 и 2, и при uCallbackMessage равно WM_MBUTTONDOWN=&H207 или WM_MBUTTONUP = &H208 Button равен 4, если событие с иконкой. Само собой разумеется, что возвращаемые X значения следуют одно за другим, как и события (Down->Up->DbClick),поэтому невозможно на одну кнопку мыши назначить два события, к примеру, Click и DbClick. События не связанные с мышью не несут практически ни какой информации, и обычно не используются, следует так же отметить, что количество констант uCallbackMessage намного больше и здесь приведена лишь небольшая часть Из описанного видно, что с иконкой можно совершить одно из следующих действий: добавить, модифицировать и удалить, при этом, модифицируя можно заменить возвращаемое событие, картинку (указатель при этом останется тем же) и всплывающую надпись (ToolTips). Следующий момент, который нужно осветить это получение hIcon (указателя на картинку). Предполагается, что иконка будет находится в исполняемом файле или в DLL с ресурсами, но ни в коем случае не валяется в виде ICO файла. Если иконка запакована в DLL, то нам понадобятся две функции:
Возвращающая hInstance библиотеки с именем lpLibFileName. Достаточно указать только имя файла с расширением, без пути. Возвращает ноль в случае ошибки
Возвращающая hIcon для иконки указанной параметром lpIconName в библиотеке. Этот параметр может быть String или Long, в зависимости от данного вами наименования в Res файле, соответственно надо изменить декларацию. Можно передать и число как строку, для этого перед числом ставится знак #, а все это берется в кавычки. Следует заметить, что использование срокового параметра не желательно из за значительно большего размера занимаемой памяти и соответственно, большего времени на передачу параметра. Функция возвращает ноль в случае ошибки Понадобится так же функция:
Выгружающая библиотеку из памяти. Параметр hLibModule это hInstanse, возвращаемое LoadLibrary. Возвращает ноль в случае ошибки. Обязательно надо не забыть выгрузить из памяти библиотеку, для освобождения памяти. Выгрузку можно произвести сразу же после добавления иконки в SystemTray. Обязательно надо не забыть выгрузить из памяти библиотеку, для освобождения памяти. Выгрузку можно произвести сразу же после добавления иконки в SystemTray.
Возвращающей hInstanse нашего приложения. В качестве lpModuleName передается имя EXE файла с расширением. Следует быть внимательным, так как имя процесса в TaskMenager не всегда соответствует имени процесса для Windows. Я использую для определения имени DLLView, можно воспользоваться, встроенным в VB System Information. Функция возвращает действительное значение только при работе скомпилированного приложения, а в режиме отладки возвращает ноль, ведь реального процесса при отладке не существует. Свойство hInstanse объекта App всегда возвращает действительное значение, однако при отладке из за отсутствия процесса LoadIcon возвращает 0, и создается "пустая" иконка, тем не менее годная для отладки (реагирующая на все события). Полученное hInstanse передаем LoadIconA, в качестве lpIconName указываем номер или имя иконки в Res файле, как и в случае с DLL. Выгружать в этом случае ничего не надо. Создание иконки можно проиллюстрировать следующим примером. Считается, что иконка с номером 101 находится в файле Project1.exe. Понятно, что пока мы его не скомпилировали, ее там нет (да и самого файла нет). Форма приложения называется Form1.
Удаление созданной иконки можно сделать так:
Размер структуры достаточно указывать один раз, так как за время жизни переменной он измениться не может, и в данном виде составляет 88 байт. Даже при изменении всплывающей строки ее длина (строки) не будет больше 64 байт. Для модификации иконки надо вызвать Shell_NotifyIcon с параметром dwMessage равным NIM_MODIFY и NID с внесенными изменениями, при этом параметр uFlags будет указывать, какие из параметров изменены. В форме Form1 для обработки, к примеру, DbClick левой кнопкой мыши по иконке можно применить следующий код:
---------------------------------------------------------------------------------------------------------------------------------------------- Добавлено @ 16:06 [offtop]Почему тэги не всегда работают нормально?[/offtop] |
| Автор: Flotskiy 16.3.2005, 07:16 |
| Доброе утро всем! Run-time error , благодарю за ответ, для меня это темный лес и ничего я не сделаю сам. А цель была следующая: Таймер поставить на 5-10 мин, запускать прогу с автозагрузки, для того, чтобы можно было проконтролировать, какие действия происходили на компе (например контроль за детьми на домашнем компе, контроль на рабочем компе, если кто посторонний что-нибудь делает). И иконку спрятать в "трей", там на ее не обратят внимания и не отключат. Вот в таком плане. Если нельзя такую процедуру выполнить, то благодарю за внимание, закрываем этот вопрос. Всего доброго, с уважением |
| Автор: Exception 16.3.2005, 15:54 |
| Сделаем, сделаем... но сегодня не успею |
| Автор: Exception 17.3.2005, 21:58 |
| Уффф... Сделал. Проблема - при снимке экрана исчезает кусор, а так... http://forum.vingrad.ru/index.php?act=ST&f=102&t=45781&unread=1 |
| Автор: Flotskiy 18.3.2005, 12:27 |
| Всем день добрый! Run-time error , благодарю за прогу, немного подправил по своему вкусу и получилось то, что хотел. Всего доброго! Суважением |
| Автор: Mephisto 22.3.2005, 17:29 |
| Только единственный бок этой проги: буфер обмена постоянно обнуляется! Могу выложить корректный код копирования экрана (если надо)! |
| Автор: Flotskiy 23.3.2005, 06:09 |
| Добрый день всем! Mephisto, показывай свой код, pse. Буду признателен за помощь. С уважением |
| Автор: Exception 24.3.2005, 16:31 | ||
Ммм да... Mephisto, ждем |
| Автор: Mephisto 2.4.2005, 23:06 | ||
Enjoy. |
| Автор: Exception 3.4.2005, 13:57 |
| +1, Mephisto |
| Автор: Flotskiy 4.4.2005, 05:16 |
| Добрый день всем! Mephisto, благодарю, и к этому топику еще один вопрос, если можно: копии экрана записываются в папку Bitmaps, как бы при достижении, например, 300 Мб из папки удалить все и пусть опять записываются новые? С уважением. |
| Автор: cardinal 5.4.2005, 18:19 |
| Модератор: Пожалуйста, один топик - один вопрос. |
| Автор: Flotskiy 6.4.2005, 06:56 |
| Добрый день всем! cardinal, я думал, что мой вопрос относится к этой же теме. С уважением. |
| Автор: Вадян! 15.4.2005, 02:20 |
| Flotskiy Мне прога тоже понравилась, наверное былобы ещё круче еслиб она не по времени копировала раб.стол а реагировала на какую либо активность рабочего стола! Я вобщето пока только учюся так что при всём желании не смогу написать такой код Run-time error если можешь покажи что нужно дописать!???!!! |
| Автор: Flotskiy 15.4.2005, 05:21 |
| Доброе утро всем! Вадян!, твоя мысль хороша, надо просить профессионалов, чтобы помогли в данном вопросе. Ребята, подправьте, pse, прогу, если можно. С уважением |
| Автор: Exception 15.4.2005, 11:22 | ||
Она копирует не рабочий стол, а как ты уже понял, весь экран. Реагировала на что например? |
| Автор: Вадян! 15.4.2005, 13:31 | ||
Run-time error
Следить например за изменением экрана Может я несу полный бред, так что не предавайте сильного значения моим словам в этом топике!!! |
| Автор: Mephisto 15.4.2005, 23:13 |
| За изменением экрана не поллучится, а вот копировать только активную фому возможно! Для этого необходимо немного поравить мой код. П.с. Кстати, мой код делает копию экрана только 1024х768. Чтобы исправить необходимо снять реальные размера экрана, в случае с формой - регион формы. Ещё, копируются только формы которые не используют индексированные цвета! |
| Автор: jurasiks 10.2.2006, 16:48 |
| А какой код добавить, чтобы скрин делался только по нажатии на кнопку (на клавиатуре) и сохранялся в формате JPG? |
| Автор: cardinal 10.2.2006, 17:23 | ||
|
| Автор: jurasiks 11.2.2006, 21:14 |
| У меня ничего не получается, в первом коде пишет, что мол "комменты не там где надо", а второй ничего ен создаёт. Может, кто выложит пример файла (в формате VB)? Буду благодарен. |
| Автор: Exception 11.2.2006, 21:23 |
| Что именно тебе нужно? Мой код отлично работает. |
| Автор: jurasiks 12.2.2006, 10:15 |
| [deleted] |
| Автор: Exception 12.2.2006, 16:17 |
| То есть в файле vb? Тебе для VB .NET нужно что ли? И что именно не работает? Так я ничего сказать не могу, где и какая возникает ошибка? |
| Автор: jurasiks 13.2.2006, 15:21 |
| [deleted] |
| Автор: Exception 13.2.2006, 16:44 |
| Тьфу. Пролистай тему от начала до конца. В начале я давал полностью рабочий код. Что именно тебя в нем не устраивает? Уж скопировать самому в редактор, думаю, нетрудно |
| Автор: jurasiks 13.2.2006, 17:11 |
| deleted |
| Автор: Exception 13.2.2006, 17:30 |
| На какой строке? Я так надеюсь, ты таймер на форму кинул? |
| Автор: jurasiks 13.2.2006, 17:37 |
| deleted |
| Автор: cardinal 13.2.2006, 17:39 |
| |
| Автор: jurasiks 13.2.2006, 17:41 |
| deleted |
| Автор: cardinal 13.2.2006, 18:03 |
| Посмотри тут: http://www.activevb.de/tipps/vb6tipps/tipp0078.html |
| Автор: jurasiks 13.2.2006, 18:09 |
| deleted |
| Автор: cardinal 14.2.2006, 14:21 |
| jurasiks, открой любую книгу по VB и хоть немного поразбирайся... Я считаю, что вопрос решен. |
| Автор: Exception 14.2.2006, 15:24 |
| Глянь событие формы KeyPress. Больше на глупые вопросы отвечать не буду. |