Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Фотографирование окна Добавлено: 13.01.06 21:29  

Автор вопроса:  Victor | Web-сайт: vt-dbnz.narod.ru | ICQ: 345743490 
Подскажите пожалуйста. Как перенести изображение окна (хотя бы клиентской части) БЕЗ всех его детенышей и перекрывающих сверху окон?

Об окне мне заранее ничего не известно, так как это может быть любое окно любого приложения, даже спрятанное или вообще неспособное к прорисовке.

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #1
Добавлено: 13.01.06 23:41
Вот пример, из статьи на сайте, может поможет, незнаю.

'Объявляем в General Form1:
Private Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Dim A As Integer
'в Properties Form1 устанавливаем BorderStyle в 0-None, для того, чтобы в
'момент получения «фотографии» экрана, детали формы не попали в «кадр»
Private Sub Form_Load()
   'делаем форму невидимой, но при этом оставляем активными все 'компоненты
   Form1.Height = 0
   Timer1.Interval = 1
   'очищаем Clipboard
   Clipboard.Clear
   'копируем изображение экрана
   keybd_event vbKeySnapshot, 1, 0&, 0&
End Sub

Private Sub Timer1_Timer()
   A = A + 1
   If A = 2 Then
      'вклеиваем изображение в картинку
      Picture1.Picture = Clipboard.GetData(vbCFBitmap)
      'задаём размеры формы и картинки
      Form1.Width = Screen.Width * 0.8
      Form1.Height = Screen.Height * 0.8
      Form1.Left = (Screen.Width - Width) / 2
      Form1.Top = (Screen.Height - Height) / 2
      Picture1.Height = Form1.ScaleHeight * 1
      Picture1.Width = Form1.ScaleWidth * 1
      Picture1.Left = (Form1.Width - Picture1.Width) / 2
      Picture1.Top = (Form1.Height - Picture1.Height) / 2
   End If
   If A = 2 Then
      'очищаем Clipboard
      Clipboard.Clear
      'выключаем Timer1
      Timer1.Enabled = False
   End If
End Sub

'для выхода из программы
Private Sub Picture1_Click()
   End
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #2 Добавлено: 14.01.06 06:34
Охренительный способ копирования экрана...
Вот порадуется пользователь, у которого в буфере обмена кусок несохранённого текста в половину дипломной работы...


Скопировать спрятанную часть DC нельзя по причине отсутствия таковой. Винда не рисует за пределами экрана, оптимизация у неё такая. А перекрытую - можно, но увидишь то, что её перекрыло.
Единственный вариант - делать окно поверх всех, снимать и отправлять обратно.

Ответить

Номер ответа: 3
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #3
Добавлено: 14.01.06 11:42
Я его не придумывал - он из статьи!

Ответить

Номер ответа: 4
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #4 Добавлено: 14.01.06 21:34
Поставь окно TOPMOST, и чтобы было в пределах экрана, попытайся спрятать все дочерние окна, чтобы не мешали (ShowWindow+SW_HIDE), сфотографируешь, затем покажешь снова спрятанные дочерние окна.

Ответить

Номер ответа: 5
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #5
Добавлено: 15.01.06 11:52
А вот такой примерчик, только для экрана:
Получить изображение экрана.

Функция, которая реализует эту возможность - GetDesktopWindow. Полный код выглядит так.
Это поместить в область деклараций модуля
   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.
      ;Dim hDesk, hDeskDC
      hDesk = GetDesktopWindow()
      hDeskDC = GetDC(hDesk)
      BitBlt Me.hDC, 0, 0, Width, Height, hDeskDC, 0, 0, SRCCOPY
Если необходимо изображение поместить в Picture, вместо Me.hDC укажите Picture1.hDC.

Ответить

Номер ответа: 6
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #6 Добавлено: 15.01.06 16:32
[root]
Ты вопрос автора читал?

Ответить

Номер ответа: 7
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #7
Добавлено: 15.01.06 16:49
2HOOLIGAN:
Читал, я подумал, может на мысль наведет, в принципе можно
позамарачиваться и попробовать переделать

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам