Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как программно сделать копию экрана? 
V
    Опции темы
Дейв
Дата 10.2.2003, 19:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите, пожалуйста, как из программы можно сделать копию экрана. Операторы типа SendKeys в этом случае не работают. Может есть какие API-функции (желательно для VB). Или есть уже готовая программка для этих целей?
  Вверх
Гость_Small
Дата 11.3.2005, 23:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











1- Щелкните на клавиатуре по клавише Print Screen (копия экрана).
2- Перейдите в редактор Word: Пуск р Программы р Word (или щелкните по иконке Word на Рабочем Столе).
3- В окне редактора Word выполните команду: Правка [Edit] р Вставка [Paste]
  Вверх
Golden Hands
Дата 12.3.2005, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 83



Программы Snagit, Corel Capture предоставляют для этого очень большие возможности.
P.S. Сорри, не посмотрел на раздел... smile

Это сообщение отредактировал(а) Golden Hands - 12.3.2005, 11:20


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
RA
Дата 12.3.2005, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: нет
Всего: 115



Одной функцией Api тут не обойдешся, а вообще тему нужно было создавать в соответвующем разделе (в разделе по VB).
PM   Вверх
Exception
  Дата 12.3.2005, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Программно? Где-то у меня примерчик лежал...
Вот:
Код

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const VK_SNAPSHOT = &H2C


Private Sub Form_Load()
App.TaskVisible = False 'Прога не видна в списке приложений
Me.Width = 0
Me.Height = 0
Timer1.Interval = 5000
End Sub

Private Sub Timer1_Timer()
Static i As Integer
i = i + 1
Clipboard.Clear
keybd_event VK_SNAPSHOT, 0, 0, 0
DoEvents
SavePicture Clipboard.GetData(vbCFBitmap), "C:\Bitmaps\" & i & ".bmp"
Clipboard.Clear
End Sub

Каждые пять сек. этот код фоткает содержимое экрана и сохраняет в папке "C:\Bitmaps"
Будут вопросы - обращайся.

ЗЫ Зарегься - проще будет smile

Это сообщение отредактировал(а) Run-time error - 12.3.2005, 11:58
PM   Вверх
cardinal
Дата 12.3.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99





--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Exception
Дата 13.3.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Только так в файле не сохранишь...
В общем в зависимости от задачи smile
PM   Вверх
Flotskiy
Дата 15.3.2005, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



День добрый всем!
Run-time error , меня заинтересовал твой код, если можешь - добавь, чтобы при запуске проги иконка сворачивалась в трей (к часикам).
С уважением

Это сообщение отредактировал(а) Flotskiy - 15.3.2005, 11:47
--------------------
FlotskiySk k
PM MAIL   Вверх
Exception
Дата 15.3.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Вот статейку нарыл:
-----------------------------------------------------------------------------------------------------------------------------------------------
Эта статья является самодостаточной, то есть в ней дана исчерпывающая информация по созданию иконки в SystemTray с помощью VB. Однако при этом она является компиляцией общедоступных источников, то есть заслуга автора состоит лишь в сборе этой информации в одном месте и пояснениях.

Основы создания иконки изложены в FAQ Льва Серебрякова. Используется пример на VB от Alexander Shherbakov. Описания функций и констант из книги Daniel Applemana и API.TXT. Вопросы связанные с редактором ресурсов не рассматриваются.

Единственная функция для работы с иконкой Shell_NotifyIcon. Ее описание на VB выглядит так:
Код

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" _ 
(ByVal dwMessage As dwMess, lpData As NOTIFYICONDATA) As Long

Возвращает ноль в случае ошибки

Тип dwMess описывается так:

Код

Public Enum dwMess


NIM_ADD = &H0 ' Добавление иконки
NIM_DELETE = &H2 ' Удаление иконки 
NIM_MODIFY = &H1 ' Изменение параметров иконки
End Enum

Переменная dwMessage должна иметь одно из этих значений.

Тип NOTIFYICONDATA имеет следующую структуру:

Код

Type NOTIFYICONDATA

cbSize As Long ' Размер переменной типа NOTIFYICONDATA
hwnd As Long ' Указатель окна создающего иконку 
uID As Long ' Указатель на иконку в пределах приложения 
uFlags As uF ' Маска для следующих параметров 
uCallbackMessage As CallMess ' Возвращаемое событие 
hIcon As Long ' Указатель на изображение для иконки 
szTip As String * 64 ' Всплывающий над иконкой текст
End Type 



Где тип uF имеет вид:


Код

Public Enum uF

NIF_MESSAGE = &H1 ' Значение имеет uCallbackMessage
NIF_ICON = &H2 ' Значение имеет hIcon 
NIF_TIP = &H4 ' Значение имеет szTip

End Enum 



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



Тип CallMess:


Код

Public Enum CallMess

WM_MOUSEMOVE = &H200 
WM_LBUTTONDOWN = &H201 
WM_LBUTTONUP = &H202
WM_LBUTTONDBLCLK = &H203
WM_RBUTTONDOWN = &H204
WM_RBUTTONUP = &H205
WM_RBUTTONDBLCLK = &H206


WM_MBUTTONDOWN = &H207
WM_MBUTTONUP = &H208
WM_MBUTTONDBLCLK = &H209
WM_SETFOCUS = &H7
WM_KEYDOWN = &H100
WM_KEYFIRST = &H100
WM_KEYLAST = &H108
WM_KEYUP = &H101

End Enum 



Эти константы обозначают, какое событие возвращается вызывающей форме. Буквально, все, что будет происходить с иконкой, будет вызывать у формы одно из перечисленных событий. Ясно, что самое частое событие самой иконки это 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, то нам понадобятся две функции:


Код

Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal _ 
lpLibFileName As String) As Long




Возвращающая hInstance библиотеки с именем lpLibFileName. Достаточно указать только имя файла с расширением, без пути. Возвращает ноль в случае ошибки


Код

Declare Function LoadIconA Lib "user32" (ByVal hInstance As Long, ByVal _
lpIconName As String) As Long



Возвращающая hIcon для иконки указанной параметром lpIconName в библиотеке. Этот параметр может быть String или Long, в зависимости от данного вами наименования в Res файле, соответственно надо изменить декларацию. Можно передать и число как строку, для этого перед числом ставится знак #, а все это берется в кавычки. Следует заметить, что использование срокового параметра не желательно из за значительно большего размера занимаемой памяти и соответственно, большего времени на передачу параметра. Функция возвращает ноль в случае ошибки


Понадобится так же функция:


Код

Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long



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


Обязательно надо не забыть выгрузить из памяти библиотеку, для освобождения памяти. Выгрузку можно произвести сразу же после добавления иконки в SystemTray.


Обязательно надо не забыть выгрузить из памяти библиотеку, для освобождения памяти. Выгрузку можно произвести сразу же после добавления иконки в SystemTray.


Код

Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" _ 
(ByVal lpModuleName As String) As Long



Возвращающей hInstanse нашего приложения. В качестве lpModuleName передается имя EXE файла с расширением. Следует быть внимательным, так как имя процесса в TaskMenager не всегда соответствует имени процесса для Windows. Я использую для определения имени DLLView, можно воспользоваться, встроенным в VB System Information. Функция возвращает действительное значение только при работе скомпилированного приложения, а в режиме отладки возвращает ноль, ведь реального процесса при отладке не существует. Свойство hInstanse объекта App всегда возвращает действительное значение, однако при отладке из за отсутствия процесса LoadIcon возвращает 0, и создается "пустая" иконка, тем не менее годная для отладки (реагирующая на все события).


Полученное hInstanse передаем LoadIconA, в качестве lpIconName указываем номер или имя иконки в Res файле, как и в случае с DLL. Выгружать в этом случае ничего не надо.


Создание иконки можно проиллюстрировать следующим примером.


Считается, что иконка с номером 101 находится в файле Project1.exe. Понятно, что пока мы его не скомпилировали, ее там нет (да и самого файла нет). Форма приложения называется Form1.


Код

Dim NID As NOTIFYICONDATA 

Sub AddIcon() 

Dim IDLib As Long ' Указатель на библиотеку
Dim IDIcon As Long ' Указатель на иконку 
Const IDMyIcon = 101 ' Идентификатор иконки внутри приложения
Dim AddResult As Long ' Результат добавления иконки

IDLib = GetModuleHandle("Project1.exe") ' Получаем hInstanse
IDIcon = LoadIcon(IDLib, "#101") ' Получаем hIcon 

' Заполняем структуру NID типа NOTIFYICONDATA

NID.cbSize = Len(NID) ' Размер структуры
NID.hwnd = Form1.hWnd ' Указатель на форму
NID.uID = IDMyIcon ' Идентификатор иконки
'Указываем, что действующими являются поля 
NID.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP 
'uCallBackMessage, hIcon и szTip.
' Указываем, что событием возвращаемым в форму 
NID.uCallbackMessage = WM_LBUTTONDOWN 
'является MouseDown с параметром Button = 2
NID.hIcon = IDIcon ' Указатель на иконку в файле
' Передаем всплывающую фразу "MyIcon", при этом обрезаем 
NID.szTip = Left$("MyIcon", 63) & Chr(0) 
'ее до 63 символов и добавляем 64-й символ с кодом ноль
' Вызываем функцию, через параметр dwMessage указываем, 

AddResult = Shell_NotifyIcon(NIM_ADD, NID) 
'что следует добавить иконку, и передаем заполненный NID

End Sub



Удаление созданной иконки можно сделать так:


Код

Sub DeleteIcon()

Dim DeletResult As Long
DeleteResult = Shell_NotifyIcon(NIM_DELETE, NID) 

' Вызываем функцию, через dwMessage указываем, 
'что следует удалить иконку, при этом, раз переменная NID
' описана на уровне модуля, не следует 
'заполнять ее заново 

End Sub 



Размер структуры достаточно указывать один раз, так как за время жизни переменной он измениться не может, и в данном виде составляет 88 байт. Даже при изменении всплывающей строки ее длина (строки) не будет больше 64 байт.


Для модификации иконки надо вызвать Shell_NotifyIcon с параметром dwMessage равным NIM_MODIFY и NID с внесенными изменениями, при этом параметр uFlags будет указывать, какие из параметров изменены.


В форме Form1 для обработки, к примеру, DbClick левой кнопкой мыши по иконке можно применить следующий код:


Код

Private Sub Form_MouseDown(Button As Integer, Shift As Integer _
X As Single, Y As Single)
' Событие MouseDown происходит не потому, 
'что пользователь нажал на кнопку мыши над иконкой, а из-за того, 
'что параметр uCallbackMessage имеет значение WM_LBUTTONDOWN 

If Y = 0 Then ' Y = 0 если событие с иконкой 
   Select Case X
      Case 515*Screen.TwipsPerPixelX ' Значение X при LeftDblClick 
                                     ' Код, выполняемый в случае LeftDblClick 
   End Select
End If

End Sub

----------------------------------------------------------------------------------------------------------------------------------------------
Добавлено @ 16:06
[offtop]Почему тэги не всегда работают нормально?[/offtop]
PM   Вверх
Flotskiy
Дата 16.3.2005, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



Доброе утро всем!
Run-time error , благодарю за ответ, для меня это темный лес и ничего я не сделаю сам.
А цель была следующая:
Таймер поставить на 5-10 мин, запускать прогу с автозагрузки, для того, чтобы можно было проконтролировать, какие действия происходили на компе (например контроль за детьми на домашнем компе, контроль на рабочем компе, если кто посторонний что-нибудь делает). И иконку спрятать в "трей", там на ее не обратят внимания и не отключат. Вот в таком плане.
Если нельзя такую процедуру выполнить, то благодарю за внимание, закрываем этот вопрос.
Всего доброго, с уважением



--------------------
FlotskiySk k
PM MAIL   Вверх
Exception
Дата 16.3.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Сделаем, сделаем...
но сегодня не успею smile
PM   Вверх
Exception
Дата 17.3.2005, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 7
Всего: 186



Уффф...
Сделал. Проблема - при снимке экрана исчезает кусор, а так...
Здесь
PM   Вверх
Flotskiy
Дата 18.3.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



Всем день добрый!
Run-time error , благодарю за прогу, немного подправил по своему вкусу и получилось то, что хотел.
Всего доброго!
Суважением


--------------------
FlotskiySk k
PM MAIL   Вверх
Mephisto
Дата 22.3.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Только единственный бок этой проги: буфер обмена постоянно обнуляется! Могу выложить корректный код копирования экрана (если надо)!
PM   Вверх
Flotskiy
Дата 23.3.2005, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 15.11.2004
Где: г. Омск

Репутация: 1
Всего: 2



Добрый день всем!

Mephisto, показывай свой код, pse.
Буду признателен за помощь.
С уважением
--------------------
FlotskiySk k
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.