Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 520
  • Last Modified:

Form Capture in VB.Net (ALT+PrintScr)

I am currently creating an application that takes a screenshot of a running process. So I have a running process called "notepad.exe" for example, and I would like the application to only take what is in that form, so nothing else around it.

Basically what I am after is doing the ALT+PrintScreen command, but though code rather then faking that the button has been pressed. (As I have seen on other forums and tutorials). What has been taken will then need to be placed within PictureBox1.

Thanks for your help,
0
DarkSharky
Asked:
DarkSharky
  • 5
  • 3
  • 2
1 Solution
 
David L. HansenProgrammer AnalystCommented:
0
 
DarkSharkyAuthor Commented:
I dont really want to use an external API which is not part of the Visual Studio 2008. Or general vb.net.

0
 
David L. HansenProgrammer AnalystCommented:
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
Mike TomlinsonMiddle School Assistant TeacherCommented:
You can use Native VB.Net code to do the screen capture part with Graphics.CopyFromScreen():
http://msdn.microsoft.com/en-us/library/system.drawing.graphics.copyfromscreen.aspx

...BUT since you're dealing with an EXTERNAL application, you'll have to resort to APIs to first determine the location/size of the external window:
Public Class Form1
 
    Private Structure RECT
        Dim Left As Integer
        Dim Top As Integer
        Dim Right As Integer
        Dim Bottom As Integer
    End Structure
 
    Private Declare Function GetWindowRect Lib "user32" (ByVal handle As IntPtr, ByRef lpRect As RECT) As Integer
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim AppNameWithoutPathTheExePart As String = "NotePad"
        Dim ps() As Process = Process.GetProcessesByName(AppNameWithoutPathTheExePart)
        If ps.Length > 0 Then
            Dim p As Process = ps(0)
            Dim pRect As RECT
            GetWindowRect(p.MainWindowHandle, pRect)
            Dim width As Integer = pRect.Right - pRect.Left + 1
            Dim height As Integer = pRect.Bottom - pRect.Top + 1
            Dim bmp As New Bitmap(width, height)
            Dim G As Graphics = Graphics.FromImage(bmp)
            G.CopyFromScreen(New Point(pRect.Left, pRect.Top), New Point(0, 0), New Size(width, height))
            G.Dispose()
            PictureBox1.Image = bmp
        End If
    End Sub
 
End Class

Open in new window

0
 
DarkSharkyAuthor Commented:
Thanks That works :D,  however one small problem.

If a form is "always on top" , and is covering the area where notepad is being used, then it will take a print screen of both the form (notepad) and the form ontop, therefore it isnt a "true" Alt+Printscreen, which does not do this.

Thanks,
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
That's correct...but you stated:

    "...but though code rather then faking that the button has been pressed."

If you want TRUE Alt-PrintScreen functionality then press that button...  ;)
(this of course requires that your external application be given focus first)

There is another approach that involves sending the external window a WM_PRINT message via the SendMessage() API but it is poorly documented, doesn't work with all windows, and is messy to implement.

Simply put, you can't have it both ways.  =\
0
 
DarkSharkyAuthor Commented:
Food for thought....

When you talk about SendMessage() API and that some windows it wont work with, do you know what type or reasons why it will not work.

Thanks,

0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
I don't know the exact reason...other than Microsoft never "solidified" it as a good practice to respond to that message in the desired manner.  Therefore it is not commonly implemented by many people...and it apps don't do it by default.
0
 
DarkSharkyAuthor Commented:
In the end I went for the solution from Idle_Mind. Thanks all . :)
0
 
DarkSharkyAuthor Commented:
Some extra comments would be nice to other users, but I understood it fine :). Wasn't quite what i wanted, but it works :)
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 5
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now