[RESOLVED] GetDC и сохранение скриншота в PictureBox

Обсуждение проблем, возникающих при разработке программ для мобильных устройств.
NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 10.09.2008 (Ср) 14:50
Откуда: Москва

[RESOLVED] GetDC и сохранение скриншота в PictureBox

Сообщение NeverGone » 20.01.2009 (Вт) 22:57

Нужно сделать скриншот экрана КПК и загрузить его в PictureBox (потом он будет масштабироваться).
Как его получить? GetDC ? Как получить "снятую" им картинку?
Подскажите, пожалуйста. Желательно примерчиком. Ну или ссылку на подобный проект, если таковые есть.
Заранее спасибо!
Последний раз редактировалось NeverGone 15.02.2010 (Пн) 20:41, всего редактировалось 1 раз.

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 10.09.2008 (Ср) 14:50
Откуда: Москва

Re: GetDC и сохранение скриншота в PictureBox

Сообщение NeverGone » 16.02.2009 (Пн) 15:37

Ну что же опять молчание? :|
Может быть, можно обойтись без GetDC?
Нашел вот такое:
Код: Выделить всё
    Private Declare Sub keybd_event Lib "coredll.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
    Private Const VK_SNAPSHOT As Short = &H2CS

    Private Sub Command2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Command2.Click
        Call keybd_event(System.Windows.Forms.Keys.Snapshot, 0, 0, 0)
        System.Threading.Thread.Sleep(200) ' To have time to catch the clipboard
        Dim data As IDataObject
        data = Clipboard.GetDataObject()
        Dim bmap As Bitmap
        If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
            bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap)
            Me.PictureBox1.Image = bmap
        End If
    End Sub

Но данный код не выводит в PictureBox ничего.
Как можно получить скриншот?

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 10.09.2008 (Ср) 14:50
Откуда: Москва

Re: GetDC и сохранение скриншота в PictureBox

Сообщение NeverGone » 27.01.2010 (Ср) 14:57

ВНЕЗАПНО ( :mrgreen: ) проблема стала опять актуальна.
Подскажите хоть, в каком направлении думать... :oops:

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Re: GetDC и сохранение скриншота в PictureBox

Сообщение Lotreck » 09.02.2010 (Вт) 21:38

Код: Выделить всё
Option Explicit On
Imports System.IO
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports Microsoft.WindowsCE.Forms
Imports System.Data

Public Class Form1
    Public Structure RECT
        Public Left As Int32
        Public Top As Int32
        Public Right As Int32
        Public Bottom As Int32
    End Structure
   
    Private Const SRCCOPY = &HCC0020
    Declare Function GetWindowRect Lib "coredll.dll" (ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
    Declare Function GetDesktopWindow Lib "coredll.dll" () As IntPtr
    Declare Function GetWindowDC Lib "coredll.dll" (ByVal hwnd As IntPtr) As IntPtr
    Declare Function GetDC Lib "coredll.dll" (ByVal hWnd As IntPtr) As IntPtr
    Declare Function ReleaseDC Lib "coredll.dll" (ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As IntPtr
    Declare Function BitBlt Lib "coredll.dll" ( _
    ByVal hdcDest As IntPtr, _
    ByVal nXDest As Integer, _
    ByVal nYDest As Integer, _
    ByVal nWidth As Integer, _
    ByVal nHeight As Integer, _
    ByVal hdcSrc As IntPtr, _
    ByVal nXSrc As Integer, _
    ByVal nYSrc As Integer, _
    ByVal dwRop As Int32) As Integer
    'скриншот экрана
    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Dim rect As New Rectangle(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
        Dim rct As New Rectangle(0, -26, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
        Dim bmp As New Bitmap(rct.Width, rct.Height)
        Dim gfx As Graphics = Graphics.FromImage(bmp)
        Dim hwnd As IntPtr = GetDesktopWindow()
        Dim hdc As IntPtr = GetDC(hwnd)
        BitBlt(gfx.GetHdc(), 0, 0, rct.Width, rct.Height, hdc, rct.Left, rct.Top, SRCCOPY)
        bmp.Save("\Storage Card\1.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
        ReleaseDC(hwnd, hdc)
        gfx.Dispose()
        PictureBox1.Image = bmp
    End Sub
    'скриншот экрана
    Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim hWndDesktop As IntPtr = GetDesktopWindow()
        Dim rct As RECT
        GetWindowRect(hWndDesktop, rct)
        rct.Top = 0
        Dim Width As Int32 = rct.Right - rct.Left
        Dim Height As Int32 = rct.Bottom - rct.Top
        Dim bmp As New Bitmap(Width, Height)
        Dim gfx As Graphics = Graphics.FromImage(bmp)
        Dim hdcWindow As IntPtr = GetDC(hWndDesktop)
        Dim hdc As IntPtr = gfx.GetHdc()
        'BitBlt(hdc.ToInt32, 0, 0, Width, Height, hdcWindow.ToInt32, rct.Left, rct.Top, SRCCOPY)
        BitBlt(hdc.ToInt32, 0, 0, Width, Height, hdcWindow.ToInt32, rct.Left, rct.Top - 26, SRCCOPY)
        bmp.Save("\Storage Card\2.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
        ReleaseDC(hWndDesktop, hdcWindow)
        gfx.ReleaseHdc(hdc)
        PictureBox1.Image = bmp
    End Sub
    'скриншот контрола
    Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim Cntr As Control
        'Cntr = Me
        Cntr = Button2
        Dim bmp As Bitmap = New Bitmap(Cntr.Width, Cntr.Height)
        Dim cForm As IntPtr = Cntr.Handle
        Dim gfx As Graphics = Graphics.FromImage(bmp)
        Dim hdcScreen As IntPtr = GetWindowDC(cForm)
        Dim hdc As IntPtr = gfx.GetHdc()
        BitBlt(hdc, 0, 0, Cntr.Width, Cntr.Height, hdcScreen, Cntr.Location.X, Cntr.Location.Y, SRCCOPY)
        gfx.ReleaseHdc(hdc)
        ReleaseDC(IntPtr.Zero, hdcScreen)
        bmp.Save("\Storage Card\3.bmp", Drawing.Imaging.ImageFormat.Bmp)
        PictureBox1.Image = bmp
    End Sub
End Class

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 10.09.2008 (Ср) 14:50
Откуда: Москва

Re: GetDC и сохранение скриншота в PictureBox

Сообщение NeverGone » 14.02.2010 (Вс) 11:35

ДДААА!!11 :D
Спасибо огромное!

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Re: GetDC и сохранение скриншота в PictureBox

Сообщение Lotreck » 14.02.2010 (Вс) 17:06

Почитай "Занимательное программирование на Visual Basic .Net" Климова, там расписано в подробностях.


Вернуться в Visual Basic для мобильных устройств

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

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

    TopList