Results 1 to 18 of 18

Thread: Screen capture of obscured objects

  1. #1

    Thread Starter
    Fanatic Member
    Join Date
    Jun 1999
    Location
    California, USA
    Posts
    662

    Post

    I need to capture a control that is partially or fully obscured. The resault needs to not have the obscuring control/windows in it.

    Code:
                     +----------------------+
                     |                      |
                     |                      |
                     |                      |
        +------------|   Object B           |
        |            |                      |
        |            +----------------------+
        |   Object A              |
        |                         |
        +-------------------------+
    In my method, the screen capture comes up like:

    Code:
    +------------|   Object B
    |            |
    |            +-------------
    |   Object A              |
    |                         |
    +-------------------------+
    The method I'm looking for would return this:

    Code:
    +-------------------------+
    |                         |
    |                         |
    |   Object A              |
    |                         |
    +-------------------------+

  2. #2
    transcendental analytic kedaman's Avatar
    Join Date
    Mar 2000
    Location
    0x002F2EA8
    Posts
    7,221
    You just need to turn autoredraw on, for that object, that is if youre capturing your own windows.
    Use
    writing software in C++ is like driving rivets into steel beam with a toothpick.
    writing haskell makes your life easier:
    reverse (p (6*9)) where p x|x==0=""|True=chr (48+z): p y where (y,z)=divMod x 13
    To throw away OOP for low level languages is myopia, to keep OOP is hyperopia. To throw away OOP for a high level language is insight.

  3. #3
    transcendental analytic kedaman's Avatar
    Join Date
    Mar 2000
    Location
    0x002F2EA8
    Posts
    7,221
    Not possible AFAIK, the areas behind the windows doesn't exist, they are drawn as soon as the WM_PAINT event is fired for those windows. If you ever noticed one way VB crashes, is that it leaves white areas when you move forms over it.
    Use
    writing software in C++ is like driving rivets into steel beam with a toothpick.
    writing haskell makes your life easier:
    reverse (p (6*9)) where p x|x==0=""|True=chr (48+z): p y where (y,z)=divMod x 13
    To throw away OOP for low level languages is myopia, to keep OOP is hyperopia. To throw away OOP for a high level language is insight.

  4. #4

    Thread Starter
    Fanatic Member
    Join Date
    Jun 1999
    Location
    California, USA
    Posts
    662
    maybe i can SendMessage the wm_paint event to the control in question, and intercept the drawing commands?

    BTW, what does AFAIK mean?

  5. #5
    New Member
    Join Date
    Oct 2000
    Location
    Kuala Lumpur
    Posts
    4

    Capture Active Screen

    Try this one...
    *************************************************
    1. Start a new Standard Exe project
    2. Add component - Microsoft RichTextBox Control
    3. Insert 2 forms - Form1 and Form2
    4. In Form1, add one Command Button (Command1)
    5. In Form2, add one Rich Text Box component (RichTextBox1)
    6. Insert one module (bas). Let the name Module1


    '=================================
    'Copy & Paste this code to Module1
    '=================================
    Option Explicit
    Option Base 0

    '--------------------------------------------------------------------
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' Visual Basic 4.0 16/32 Capture Routines
    '
    ' This module contains several routines for capturing windows into a
    ' picture. All the routines work on both 16 and 32 bit Windows
    ' platforms.
    ' The routines also have palette support.
    '
    ' CreateBitmapPicture - Creates a picture object from a bitmap and
    ' palette
    ' CaptureWindow - Captures any window given a window handle
    ' CaptureActiveWindow - Captures the active window on the desktop
    ' CaptureForm - Captures the entire form
    ' CaptureClient - Captures the client area of a form
    ' CaptureScreen - Captures the entire screen
    ' PrintPictureToFitPage - prints any picture as big as possible on
    ' the page
    '
    ' NOTES



    ' - No error trapping is included in these routines
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Private Type PALETTEENTRY
    peRed As Byte
    peGreen As Byte
    peBlue As Byte
    peFlags As Byte
    End Type

    Private Type LOGPALETTE
    palVersion As Integer
    palNumEntries As Integer
    palPalEntry(255) As PALETTEENTRY ' Enough for 256 colors
    End Type

    Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
    End Type

    #If Win32 Then

    Private Const RASTERCAPS As Long = 38
    Private Const RC_PALETTE As Long = &H100
    Private Const SIZEPALETTE As Long = 104

    Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type

    Private Declare Function CreateCompatibleDC Lib "gdi32" ( _
    ByVal hDC As Long) As Long
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" ( _
    ByVal hDC As Long, ByVal nWidth As Long, _
    ByVal nHeight As Long) As Long
    Private Declare Function GetDeviceCaps Lib "gdi32" ( _
    ByVal hDC As Long, ByVal iCapabilitiy As Long) As Long
    Private Declare Function GetSystemPaletteEntries Lib "gdi32" ( _
    ByVal hDC As Long, ByVal wStartIndex As Long, _
    ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) _
    As Long
    Private Declare Function CreatePalette Lib "gdi32" ( _
    lpLogPalette As LOGPALETTE) As Long
    Private Declare Function SelectObject Lib "gdi32" ( _
    ByVal hDC As Long, ByVal hObject As Long) As Long
    Private Declare Function BitBlt Lib "gdi32" ( _
    ByVal hDCDest As Long, ByVal XDest As Long, _
    ByVal YDest As Long, ByVal nWidth As Long, _
    ByVal nHeight As Long, ByVal hDCSrc As Long, _
    ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) _
    As Long
    Private Declare Function DeleteDC Lib "gdi32" ( _
    ByVal hDC As Long) As Long
    Private Declare Function GetForegroundWindow Lib "USER32" () _
    As Long
    Private Declare Function SelectPalette Lib "gdi32" ( _
    ByVal hDC As Long, ByVal hPalette As Long, _
    ByVal bForceBackground As Long) As Long
    Private Declare Function RealizePalette Lib "gdi32" ( _
    ByVal hDC As Long) As Long
    Private Declare Function GetWindowDC Lib "USER32" ( _
    ByVal hWnd As Long) As Long
    Private Declare Function GetDC Lib "USER32" ( _
    ByVal hWnd As Long) As Long
    Private Declare Function GetWindowRect Lib "USER32" ( _
    ByVal hWnd As Long, lpRect As RECT) As Long
    Private Declare Function ReleaseDC Lib "USER32" ( _
    ByVal hWnd As Long, ByVal hDC As Long) As Long
    Private Declare Function GetDesktopWindow Lib "USER32" () As Long

    Private Type PicBmp
    size As Long
    Type As Long
    hBmp As Long
    hPal As Long
    Reserved As Long
    End Type

    Private Declare Function OleCreatePictureIndirect _
    Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, _
    ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

    #ElseIf Win16 Then

    Private Const RASTERCAPS As Integer = 38
    Private Const RC_PALETTE As Integer = &H100
    Private Const SIZEPALETTE As Integer = 104

    Private Type RECT
    Left As Integer
    Top As Integer
    Right As Integer
    Bottom As Integer
    End Type

    Private Declare Function CreateCompatibleDC Lib "GDI" ( _
    ByVal hDC As Integer) As Integer
    Private Declare Function CreateCompatibleBitmap Lib "GDI" ( _
    ByVal hDC As Integer, ByVal nWidth As Integer, _
    ByVal nHeight As Integer) As Integer
    Private Declare Function GetDeviceCaps Lib "GDI" ( _
    ByVal hDC As Integer, ByVal iCapabilitiy As Integer) As Integer
    Private Declare Function GetSystemPaletteEntries Lib "GDI" ( _
    ByVal hDC As Integer, ByVal wStartIndex As Integer, _
    ByVal wNumEntries As Integer, _
    lpPaletteEntries As PALETTEENTRY) As Integer
    Private Declare Function CreatePalette Lib "GDI" ( _
    lpLogPalette As LOGPALETTE) As Integer
    Private Declare Function SelectObject Lib "GDI" ( _
    ByVal hDC As Integer, ByVal hObject As Integer) As Integer
    Private Declare Function BitBlt Lib "GDI" ( _
    ByVal hDCDest As Integer, ByVal XDest As Integer, _
    ByVal YDest As Integer, ByVal nWidth As Integer, _
    ByVal nHeight As Integer, ByVal hDCSrc As Integer, _
    ByVal XSrc As Integer, ByVal YSrc As Integer, _
    ByVal dwRop As Long) As Integer
    Private Declare Function DeleteDC Lib "GDI" ( _
    ByVal hDC As Integer) As Integer
    Private Declare Function GetForegroundWindow Lib "user" _
    Alias "GetActiveWindow" () As Integer
    Private Declare Function SelectPalette Lib "user" ( _
    ByVal hDC As Integer, ByVal hPalette As Integer, ByVal _
    bForceBackground As Integer) As Integer
    Private Declare Function RealizePalette Lib "user" ( _
    ByVal hDC As Integer) As Integer
    Private Declare Function GetWindowDC Lib "user" ( _
    ByVal hWnd As Integer) As Integer
    Private Declare Function GetDC Lib "user" ( _
    ByVal hWnd As Integer) As Integer
    Private Declare Function GetWindowRect Lib "user" ( _
    ByVal hWnd As Integer, lpRect As RECT) As Integer
    Private Declare Function ReleaseDC Lib "user" ( _
    ByVal hWnd As Integer, ByVal hDC As Integer) As Integer
    Private Declare Function GetDesktopWindow Lib "user" () As Integer

    Private Type PicBmp
    size As Integer
    Type As Integer
    hBmp As Integer
    hPal As Integer
    Reserved As Integer
    End Type

    Private Declare Function OleCreatePictureIndirect _
    Lib "oc25.dll" (PictDesc As PicBmp, RefIID As GUID, _
    ByVal fPictureOwnsHandle As Integer, IPic As IPicture) _
    As Integer

    #End If

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' CreateBitmapPicture
    ' - Creates a bitmap type Picture object from a bitmap and palette
    '
    ' hBmp
    ' - Handle to a bitmap
    '
    ' hPal
    ' - Handle to a Palette
    ' - Can be null if the bitmap doesn't use a palette
    '
    ' Returns
    ' - Returns a Picture object containing the bitmap
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    #If Win32 Then
    Public Function CreateBitmapPicture(ByVal hBmp As Long, _
    ByVal hPal As Long) As Picture

    Dim r As Long
    #ElseIf Win16 Then
    Public Function CreateBitmapPicture(ByVal hBmp As Integer, _
    ByVal hPal As Integer) As Picture

    Dim r As Integer
    #End If
    Dim Pic As PicBmp
    ' IPicture requires a reference to "Standard OLE Types"
    Dim IPic As IPicture
    Dim IID_IDispatch As GUID

    ' Fill in with IDispatch Interface ID
    With IID_IDispatch
    .Data1 = &H20400
    .Data4(0) = &HC0
    .Data4(7) = &H46
    End With

    ' Fill Pic with necessary parts
    With Pic
    .size = Len(Pic) ' Length of structure
    .Type = vbPicTypeBitmap ' Type of Picture (bitmap)
    .hBmp = hBmp ' Handle to bitmap
    .hPal = hPal ' Handle to palette (may be null)
    End With

    ' Create Picture object
    r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

    ' Return the new Picture object
    Set CreateBitmapPicture = IPic
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' CaptureWindow
    ' - Captures any portion of a window
    '
    ' hWndSrc
    ' - Handle to the window to be captured
    '
    ' Client
    ' - If True CaptureWindow captures from the client area of the
    ' window
    ' - If False CaptureWindow captures from the entire window
    '
    ' LeftSrc, TopSrc, WidthSrc, HeightSrc
    ' - Specify the portion of the window to capture
    ' - Dimensions need to be specified in pixels
    '
    ' Returns
    ' - Returns a Picture object containing a bitmap of the specified
    ' portion of the window that was captured
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''
    '
    #If Win32 Then
    Public Function CaptureWindow(ByVal hWndSrc As Long, _
    ByVal client As Boolean, ByVal LeftSrc As Long, _
    ByVal TopSrc As Long, ByVal WidthSrc As Long, _
    ByVal HeightSrc As Long) As Picture

    Dim hDCMemory As Long
    Dim hBmp As Long
    Dim hBmpPrev As Long
    Dim r As Long
    Dim hDCSrc As Long
    Dim hPal As Long
    Dim hPalPrev As Long
    Dim RasterCapsScrn As Long
    Dim HasPaletteScrn As Long
    Dim PaletteSizeScrn As Long
    #ElseIf Win16 Then
    Public Function CaptureWindow(ByVal hWndSrc As Integer, _
    ByVal client As Boolean, ByVal LeftSrc As Integer, _
    ByVal TopSrc As Integer, ByVal WidthSrc As Long, _
    ByVal HeightSrc As Long) As Picture

    Dim hDCMemory As Integer
    Dim hBmp As Integer
    Dim hBmpPrev As Integer
    Dim r As Integer
    Dim hDCSrc As Integer
    Dim hPal As Integer
    Dim hPalPrev As Integer
    Dim RasterCapsScrn As Integer
    Dim HasPaletteScrn As Integer
    Dim PaletteSizeScrn As Integer
    #End If
    Dim LogPal As LOGPALETTE

    ' Depending on the value of Client get the proper device context
    If client Then
    hDCSrc = GetDC(hWndSrc) ' Get device context for client area
    Else
    hDCSrc = GetWindowDC(hWndSrc) ' Get device context for entire
    ' window
    End If

    ' Create a memory device context for the copy process
    hDCMemory = CreateCompatibleDC(hDCSrc)
    ' Create a bitmap and place it in the memory DC
    hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
    hBmpPrev = SelectObject(hDCMemory, hBmp)

    ' Get screen properties
    RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS) ' Raster
    'capabilities
    HasPaletteScrn = RasterCapsScrn And RC_PALETTE ' Palette
    'support
    PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE) ' Size of
    ' palette

    ' If the screen has a palette make a copy and realize it
    If HasPaletteScrn And (PaletteSizeScrn = 256) Then
    ' Create a copy of the system palette
    LogPal.palVersion = &H300
    LogPal.palNumEntries = 256
    r = GetSystemPaletteEntries(hDCSrc, 0, 256, _
    LogPal.palPalEntry(0))
    hPal = CreatePalette(LogPal)
    ' Select the new palette into the memory DC and realize it
    hPalPrev = SelectPalette(hDCMemory, hPal, 0)
    r = RealizePalette(hDCMemory)
    End If

    ' Copy the on-screen image into the memory DC
    r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, _
    LeftSrc, TopSrc, vbSrcCopy)

    ' Remove the new copy of the on-screen image
    hBmp = SelectObject(hDCMemory, hBmpPrev)

    ' If the screen has a palette get back the palette that was
    ' selected in previously
    If HasPaletteScrn And (PaletteSizeScrn = 256) Then
    hPal = SelectPalette(hDCMemory, hPalPrev, 0)
    End If

    ' Release the device context resources back to the system
    r = DeleteDC(hDCMemory)
    r = ReleaseDC(hWndSrc, hDCSrc)

    ' Call CreateBitmapPicture to create a picture object from the
    ' bitmap and palette handles. Then return the resulting picture
    ' object.
    Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' CaptureScreen
    ' - Captures the entire screen
    '
    ' Returns
    ' - Returns a Picture object containing a bitmap of the screen
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    Public Function CaptureScreen() As Picture
    #If Win32 Then
    Dim hWndScreen As Long
    #ElseIf Win16 Then
    Dim hWndScreen As Integer
    #End If

    ' Get a handle to the desktop window
    hWndScreen = GetDesktopWindow()

    ' Call CaptureWindow to capture the entire desktop give the handle
    ' and return the resulting Picture object

    Set CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, _
    Screen.Width \ Screen.TwipsPerPixelX, _
    Screen.Height \ Screen.TwipsPerPixelY)
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' CaptureForm
    ' - Captures an entire form including title bar and border
    '
    ' frmSrc
    ' - The Form object to capture
    '
    ' Returns
    ' - Returns a Picture object containing a bitmap of the entire
    ' form
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    Public Function CaptureForm(frmSrc As Form) As Picture
    ' Call CaptureWindow to capture the entire form given it's window
    ' handle and then return the resulting Picture object
    Set CaptureForm = CaptureWindow(frmSrc.hWnd, False, 0, 0, _
    frmSrc.ScaleX(frmSrc.Width, vbTwips, vbPixels), _
    frmSrc.ScaleY(frmSrc.Height, vbTwips, vbPixels))
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' CaptureClient
    ' - Captures the client area of a form
    '
    ' frmSrc
    ' - The Form object to capture
    '
    ' Returns
    ' - Returns a Picture object containing a bitmap of the form's
    ' client area
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    Public Function CaptureClient(frmSrc As Form) As Picture
    ' Call CaptureWindow to capture the client area of the form given
    ' it's window handle and return the resulting Picture object
    Set CaptureClient = CaptureWindow(frmSrc.hWnd, True, 0, 0, _
    frmSrc.ScaleX(frmSrc.ScaleWidth, frmSrc.ScaleMode, vbPixels), _
    frmSrc.ScaleY(frmSrc.ScaleHeight, frmSrc.ScaleMode, vbPixels))
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' CaptureActiveWindow
    ' - Captures the currently active window on the screen
    '
    ' Returns
    ' - Returns a Picture object containing a bitmap of the active
    ' window
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    Public Function CaptureActiveWindow() As Picture
    #If Win32 Then
    Dim hWndActive As Long
    Dim r As Long
    #ElseIf Win16 Then
    Dim hWndActive As Integer
    Dim r As Integer
    #End If
    Dim RectActive As RECT

    ' Get a handle to the active/foreground window
    hWndActive = GetForegroundWindow()

    ' Get the dimensions of the window
    r = GetWindowRect(hWndActive, RectActive)

    ' Call CaptureWindow to capture the active window given it's
    ' handle and return the Resulting Picture object
    Set CaptureActiveWindow = CaptureWindow(hWndActive, False, 0, 0, _
    RectActive.Right - RectActive.Left, _
    RectActive.Bottom - RectActive.Top)
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' PrintPictureToFitPage
    ' - Prints a Picture object as big as possible
    '
    ' Prn
    ' - Destination Printer object
    '
    ' Pic
    ' - Source Picture object
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    Public Sub PrintPictureToFitPage(Prn As Printer, Pic As Picture)
    Const vbHiMetric As Integer = 8
    Dim PicRatio As Double
    Dim PrnWidth As Double
    Dim PrnHeight As Double
    Dim PrnRatio As Double
    Dim PrnPicWidth As Double
    Dim PrnPicHeight As Double

    ' Determine if picture should be printed in landscape or portrait
    ' and set the orientation
    If Pic.Height >= Pic.Width Then
    Prn.Orientation = vbPRORPortrait ' Taller than wide
    Else
    Prn.Orientation = vbPRORLandscape ' Wider than tall
    End If

    ' Calculate device independent Width to Height ratio for picture
    PicRatio = Pic.Width / Pic.Height

    ' Calculate the dimentions of the printable area in HiMetric
    PrnWidth = Prn.ScaleX(Prn.ScaleWidth, Prn.ScaleMode, vbHiMetric)
    PrnHeight = Prn.ScaleY(Prn.ScaleHeight, Prn.ScaleMode, vbHiMetric)
    ' Calculate device independent Width to Height ratio for printer
    PrnRatio = PrnWidth / PrnHeight

    ' Scale the output to the printable area
    If PicRatio >= PrnRatio Then
    ' Scale picture to fit full width of printable area
    PrnPicWidth = Prn.ScaleX(PrnWidth, vbHiMetric, Prn.ScaleMode)
    PrnPicHeight = Prn.ScaleY(PrnWidth / PicRatio, vbHiMetric, _
    Prn.ScaleMode)
    Else
    ' Scale picture to fit full height of printable area
    PrnPicHeight = Prn.ScaleY(PrnHeight, vbHiMetric, Prn.ScaleMode)
    PrnPicWidth = Prn.ScaleX(PrnHeight * PicRatio, vbHiMetric, _
    Prn.ScaleMode)
    End If

    ' Print the picture using the PaintPicture method
    Prn.PaintPicture Pic, 0, 0, PrnPicWidth, PrnPicHeight
    End Sub





    '===============================
    'Copy & Paste this code to Form1
    '===============================
    Private Sub Command1_Click()
    Clipboard.Clear
    Clipboard.SetData CaptureActiveWindow(), vbCFBitmap
    Form2.Show
    Unload Me
    End Sub

    Private Sub Form_Load()
    Command1.Caption = "Capture this form to Rich Text Box"
    Me.Caption = "Capture Active Screen"
    End Sub





    '===============================
    'Copy & Paste this code to Form2
    '===============================
    Private Sub Form_Load()
    RichTextBox1.Text = ""
    Me.Caption = "Nahhhh... you go!!!"
    Me.WindowState = 2
    RichTextBox1.Top = 135
    RichTextBox1.Left = 135
    End Sub

    Private Sub Form_Resize()
    RichTextBox1.Width = 0.9 * Me.Width
    RichTextBox1.Height = 0.9 * Me.Height
    End Sub

    Private Sub RichTextBox1_GotFocus()
    SendKeys "^{v}", True
    End Sub
    -oHmHaLiA-

  6. #6
    transcendental analytic kedaman's Avatar
    Join Date
    Mar 2000
    Location
    0x002F2EA8
    Posts
    7,221
    WM_PAINT would only update the area that is exposed, AFAIK means As Far As I Know, you know, i've tried this myself, even changing the look of a window but it seems like you can't, In Windowblinds they subclassed for WM_PAINT and drawed the custom borders everytime the it exposed, so the only way out is to put the form in foreground and capture it.
    Use
    writing software in C++ is like driving rivets into steel beam with a toothpick.
    writing haskell makes your life easier:
    reverse (p (6*9)) where p x|x==0=""|True=chr (48+z): p y where (y,z)=divMod x 13
    To throw away OOP for low level languages is myopia, to keep OOP is hyperopia. To throw away OOP for a high level language is insight.

  7. #7
    New Member
    Join Date
    Aug 2002
    Posts
    8
    as far as i know bitblt and getdc's and stuff only hold display information therefore whatever is displayed is all your going to get... but the data for what to display MUST be someplace by accessing that you could most likely get the image you need I would like to see it happen also but im not that great w/ that stuff

  8. #8
    transcendental analytic kedaman's Avatar
    Join Date
    Mar 2000
    Location
    0x002F2EA8
    Posts
    7,221
    Originally posted by vinny
    as far as i know bitblt and getdc's and stuff only hold display information therefore whatever is displayed is all your going to get... but the data for what to display MUST be someplace by accessing that you could most likely get the image you need I would like to see it happen also but im not that great w/ that stuff
    Custom drawn controls might have a double buffer, but that is upto the owner.. there's no generic way of knowing, its stuck up inside windowproc and theres no way of telling what else is drawn..
    Use
    writing software in C++ is like driving rivets into steel beam with a toothpick.
    writing haskell makes your life easier:
    reverse (p (6*9)) where p x|x==0=""|True=chr (48+z): p y where (y,z)=divMod x 13
    To throw away OOP for low level languages is myopia, to keep OOP is hyperopia. To throw away OOP for a high level language is insight.

  9. #9
    New Member
    Join Date
    Aug 2002
    Posts
    8
    anyway getwindowprocess might be able to at least pick up text drawn on the window if you find the right location?

    im trying to do this with an applet window

  10. #10
    New Member
    Join Date
    Aug 2002
    Posts
    8
    actually how about this..
    i know i can bitblt a invisible picture box.. ive done it in games
    how about making the window invisible then bitblting it
    maybe w/ showwindow or some other method... think that would work

  11. #11
    Hyperactive Member
    Join Date
    Oct 2001
    Location
    The Netherlands
    Posts
    403
    Well did it?
    There are 10 types of people, those who understand binary and those who don't

    http://merlijn.beyonix.net

  12. #12
    Kitten CornedBee's Avatar
    Join Date
    Aug 2001
    Location
    In a microchip!
    Posts
    11,594
    You could maybe get the window you want to capture. Then crawl up the hierarchy calling MoveWindow for every window you come upon to move it to the front of the z-order. Maybe make the windows all topmost for the moment you capture them.

    Then update the window to force redrawing and you should be fine.
    All the buzzt
    CornedBee

    "Writing specifications is like writing a novel. Writing code is like writing poetry."
    - Anonymous, published by Raymond Chen

    Don't PM me with your problems, I scan most of the forums daily. If you do PM me, I will not answer your question.

  13. #13
    Junior Member
    Join Date
    Apr 2004
    Posts
    26

    Dear agent

    sorry i dont know then answer but i have my own question
    how do you omit objectb?
    i have the same project as yours.
    but i want to omit or hide every window that are over my active window .
    thanks anyway

  14. #14

    Thread Starter
    Fanatic Member
    Join Date
    Jun 1999
    Location
    California, USA
    Posts
    662
    oh this is from such a long time ago. never was solved.

    New idea. use LockWindowUpdate(GetDesktopWindow) on the screen's hwnd, set control's parent to screen and make it topmost, tell it to redraw, capture it, reset it's parent, and LoickWindowUpdate(0)

    never tried it, but it may work

  15. #15
    Junior Member
    Join Date
    Apr 2004
    Posts
    26

    thanks

    thanks for your reply.
    what i want is somthing different.
    i want if object a has intersection with object b then intersection part showed black.like application sharing programs.is it possible or not?
    thanks anyway.

  16. #16
    Ex-Super Mod'rater Electroman's Avatar
    Join Date
    Sep 2000
    Location
    Newcastle, England
    Posts
    4,349

    Re: thanks

    Posted by vvampirevv
    thanks for your reply.
    what i want is somthing different.
    i want if object a has intersection with object b then intersection part showed black.like application sharing programs.is it possible or not?
    thanks anyway.
    If I am understanding you right then wouldn't it just be a case of capturing the area as normal then find the insterestion area and Blt a black box over it?
    When your thread has been resolved please edit the original post in the thread ()
    and amend "-[RESOLVED]-" to the end of the title and change the icon to , Thank you.

    When posting Code use the [VBCode]Code Here[/VBCode] tags to be able to use the code highlighting.

  17. #17
    Junior Member
    Join Date
    Apr 2004
    Posts
    26

    thanks electroman

    the problem is how can i find intersection part and how can i feel it black!!!!!!
    thanks anyway

  18. #18
    Ex-Super Mod'rater Electroman's Avatar
    Join Date
    Sep 2000
    Location
    Newcastle, England
    Posts
    4,349
    If your just using normal VB controls then it would be possible using the Left, Top, Width & Height propertys of the controls. Mind if you don't want to think up some collision code for it then You could create a RECt for each of the Controls then use the IntersectRect() API
    VB Code:
    1. Private Declare Function IntersectRect Lib "user32" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long
    The RECT returned from the APi would then beused to Blt a black box over the area. How this would be done all depends on how you are capturing the original image and how it is stored .
    When your thread has been resolved please edit the original post in the thread ()
    and amend "-[RESOLVED]-" to the end of the title and change the icon to , Thank you.

    When posting Code use the [VBCode]Code Here[/VBCode] tags to be able to use the code highlighting.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width