Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / PrintScreen / 25 сообщений из 25, страница 1 из 1
03.02.2004, 11:05
    #32396252
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Помогите кто может таким примером:
Программно снять PrintScreen и поместить его в таблицу Access.

Хоть намекните где искать...
...
Рейтинг: 0 / 0
03.02.2004, 11:16
    #32396276
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
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_MENU = &H12
Private Const VK_SNAPSHOT = &H2C
Private Const KEYEVENTF_KEYUP = &H2

Private Sub Command1_Click()
' Press Alt.
'keybd_event VK_MENU, 0, 0, 0
'DoEvents

' Press Print Scrn.
keybd_event VK_SNAPSHOT, 1, 0, 0
DoEvents

' Release Alt.
'keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
'DoEvents
End Sub
а дальше-то как в таблицу вставить?
...
Рейтинг: 0 / 0
03.02.2004, 11:24
    #32396289
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Ну вот и сам себе помог.
В таблицу можешь только поместить графический файл в поле типа OLE.
Если будешь много таких файлов пихать , твою базу "разнесет" до непристойных размеров (оно тебе надо?) Можно правда хранить файлы на винте, а в таблице хранить путь к ним.
Вот у меня вопрос возник, а для чего это тебе надо то? За юзерами во время работы следтть что ли?
...
Рейтинг: 0 / 0
03.02.2004, 11:40
    #32396315
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
У меня база в сети, дык вот, чтоб не бегать к ним(в другой корпус) я реализую такую схему:

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

такие дела...
...
Рейтинг: 0 / 0
03.02.2004, 11:43
    #32396322
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Неужели так "круто" база написана , что ты ошибки протоколируешь?
Поставь RAdmin и смотри на экран юзера от себя!
...
Рейтинг: 0 / 0
03.02.2004, 11:46
    #32396327
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Я не админ сети и RAdmin поставить не могу.

База является клиентским приложением к SQL-Server и ошибки ещё и от-туда лезут. В процессе становления мы(с базой :)). А начальство, оно такое..., медлить не любит.
...
Рейтинг: 0 / 0
03.02.2004, 11:59
    #32396351
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Если клиентская база на Access , надо думать это проект ADP. Зачем его держать в сети , файл проекта надо раздать на клиентские юзерские машины.
А вот в сети должна быть база SQL -вская и юзеры со своих рабочих мест должны к ней коннектиться.

Для превращения снятого образа экрана в файл есть API функция , только как то не приходилось с ней работать. Порыскай в API.

Я так понял ты сгенерировал нажатие клавиши PrtScr . Образ экранный надо еще взять и пихнуть в файл. Вообще зарули на форум С++ там подскажут.
...
Рейтинг: 0 / 0
03.02.2004, 12:06
    #32396364
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Хорошо, спасибо
...
Рейтинг: 0 / 0
03.02.2004, 15:04
    #32396813
Z
Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Функция, которая реализует эту возможность - GetDesktopWindow. Полный код выглядит так.
Это поместить в область деклараций модуля

Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long

Private Declare Function BitBlt Lib "gdi32" _

(ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, _

ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _

ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Const SRCCOPY = &HCC0020

‘Код, копирующий изображение экрана в окно. Размещается в форме. Не забудьте свойство формы AutoRedraw ‘установить в True.

Dim hDesk, hDeskDC

hDesk = GetDesktopWindow()

hDeskDC = GetDC(hDesk) BitBlt Me.hDC, 0, 0, Width, Height, hDeskDC, 0, 0, SRCCOPY

‘Если необходимо изображение поместить в Picture, вместо Me.hDC укажите Picture1.hDC.
А что такое Me.hDC???
...
Рейтинг: 0 / 0
03.02.2004, 15:24
    #32396833
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Тут я попробовал. Не идет.
Да, что такое Me.hDC (у формы такого нет свойства / метода / события)
...
Рейтинг: 0 / 0
03.02.2004, 15:29
    #32396840
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Вот и у меня не идет

Этот пример для создания проекта на VB, там есть такое свойство, а что это и как Picture1.hDC заменить на рисунок в форме, кто знает?
...
Рейтинг: 0 / 0
03.02.2004, 15:37
    #32396846
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Попробовал на VB6 , тоже что то не работает.
Все сделал как полагается в модуль засунул это

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Const SRCCOPY = &HCC0020

Свойство формы AutoRedraw=True

Код кнопки вот
Private Sub Command1_Click()
Dim hDesk, hDeskDC
hDesk = GetDesktopWindow

hDeskDC = GetDC(hDesk)
BitBlt Me.hDC, 0, 0, Width, Height, hDeskDC, 0, 0, SRCCOPY
End Sub

Что не так?
...
Рейтинг: 0 / 0
03.02.2004, 16:25
    #32396935
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
В принципе, вы делаете все правильно.

Получается hDC контекст рабочего стола через GetDesktopWindow, потом используя функцию побитового копирования BitBlt вы копируете битмап одного контекста в другой. В вашем случае вы используете собственную форму. Свойство hDc есть помойму токо у форм в VB6 (в принципе он конечно есть у любого окна, просто ввиде свойства оно не везде торчит).

Лучше проводить эксперименты не форме, а на Picture.
В свое время я проделывал обратную операцию - из Picture или bmp файла рисовал картинку поверх рабочего стола (соотв. через BitBlt)

Должно все получится. Проверте все ваши значения во время выполнения, например: Width, Height не должны быть пустыми и размер задается в пикселах, hDeskDC тоже >0 ну и Picture.hDc тоже >0, константа у вас задана правильно SRCCOPY . Так что больше ничего ошибочного я не вижу.
...
Рейтинг: 0 / 0
03.02.2004, 16:36
    #32396949
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
А проще, как мне изображение экрана перекинуть в Dim b() As Byte
...
Рейтинг: 0 / 0
03.02.2004, 17:00
    #32396983
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
SergeySV ?
...
Рейтинг: 0 / 0
03.02.2004, 17:18
    #32397012
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Все в VB6 получилось , а как это в Access то сделать?
У формы Access нет свойства Me.hDC.
...
Рейтинг: 0 / 0
03.02.2004, 18:00
    #32397085
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Тут не обязательно нужна форма, нужен любой объект у которого в наличии hDc. Проще засунуть в Picture, сделай его невидимым и вперед. У него помойму уже есть готовые методы по сохранению загруженного битмапа ввиде файла-bmp или еще что-нибудь (нет под рукой VB6). C той же формой вы столкнетесь с такой же проблемой (если не с большой), ведь вам в конечном варианте что надо получить? Уж наверное не просто показать картинку на форме и сохранить ее или преобразовать.

На счет преобразования ничего сразу сказать не могу, хотите в массив Byte?, проще наврное будет скинуть в bmp-файл и считать его потом в массив.
...
Рейтинг: 0 / 0
03.02.2004, 18:34
    #32397131
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Ок, все дело в том, что не хватает знаний по этому вопросу. Как считать из bmp проблем нет. Необходимо эту картинку будет загрузить в таблицу. Как это сделать из bmp-файла я уже знаю. Напишите пример пожалуйста, как скинуть в bmp?!?!?!

или на мыло может? - mvn_2000@mail.ru
...
Рейтинг: 0 / 0
03.02.2004, 18:41
    #32397141
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Мне надо самому покопаться, как там лучше из hDc в bmp то скинуть...
...
Рейтинг: 0 / 0
03.02.2004, 19:09
    #32397170
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Пожалуйста, покопайся!

Я целый день убил на это дело. А там глядишь и я тебе пригожусь!
...
Рейтинг: 0 / 0
04.02.2004, 10:50
    #32397581
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Неужели никто больше не знает?
...
Рейтинг: 0 / 0
04.02.2004, 11:43
    #32397695
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Просто этот вопрос больше специфичен дл форума по VB6 (для продвинутых), здесь даже мало у кого есть VB6, чтобы пощупать спец. контролы.
...
Рейтинг: 0 / 0
04.02.2004, 16:23
    #32398286
Mike_LV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Я использую для просмотра ошибок времени выполнения специальную процедуру, которая вызывается из события формы ОШИБКА(OnError).

Private Sub Form_Error(DataErr As Integer, Response As Integer)
UpdateErrorsTable DataErr, Me.Name
End Sub

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

Function UpdateErrorsTable(ByVal DataErr As Long, FuncName As String, Optional strSqls As String) As Boolean
Dim dbs As Database
Dim rst As Recordset
Dim y As Variant
Dim frm As Form
Dim Rpt As Report
Dim ctl As Control
Dim intCurrentType As Integer
Dim strCurrentName As String

intCurrentType = Application.CurrentObjectType
strCurrentName = Application.CurrentObjectName
On Error Resume Next
Set frm = Screen.ActiveForm
Set ctl = Screen.ActiveControl
'On Error GoTo Err_Err_handler
On Error Resume Next
Err.Raise DataErr
Err_Err_handler:
If CurrentUser() = "Admin" Then
If Err <> 0 Then
MsgBox Err.Number & " " & Err.Description & " " & Err.Source, vbOKOnly
End If
y = Error(Err)
y = AccessError(DataErr)
If AccessError(DataErr) = "" Then
MsgBox Error(DataErr) & ", in frm or rpt " & frm.Name & " in ctl " & ctl.Name, vbOKOnly
Else
MsgBox AccessError(DataErr) & ", in frm or rpt " & frm.Name & " in ctl " & ctl.Name, vbOKOnly
End If
End If
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("ErrorsTable", dbOpenDynaset)
rst.AddNew
rst![Datums] = Now
rst![Jusers] = CurrentUser()
rst![ErrorsNum] = DataErr
rst![AccessErr] = AccessError(DataErr)
rst![VBErr] = Err.Description & "; " & strSqls
rst![ErrSource] = Err.Source & ", in frm or rpt " & frm.Name & " in ctl " & ctl.Name & ", func: " & FuncName
rst.Update
rst.Close
Set dbs = Nothing
End Function
...
Рейтинг: 0 / 0
04.02.2004, 16:41
    #32398318
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Прикольно... это к чему.
...
Рейтинг: 0 / 0
05.02.2004, 08:47
    #32398783
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrintScreen
Я точно так же делаю :)

Только вот решил скрин добавить.
Вотhttp://am.rusimport.ru/MsAccess/topic.aspx?ID=10], если кому нужно смотрите. Проблема решена, тема закрыта.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / PrintScreen / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]