Visual Basic .NET Forums  
Click here to advertise with us

Go Back   Visual Basic .NET Forums > VB.NET > Windows Forms

Windows Forms Discussion related to Winforms application development

VB.NET Forums Newsletter Signup:
Email address:


Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 06-18-2009, 5:26 AM
VB.NET Forum Newbie
.NET Framework: .NET 2.0 (VS 2005)
 
Join Date: Jun 2009
Posts: 16
Reputation: 10
mcfly is on a distinguished programming path ahead
Default Capturing forms using sendkeys

Hi,

my program at the moment will capture forms using the sendkeys command, I use the code:

Code:
SendKeys.Send("%" + "{PRTSC}")
Can anyone explain why I can capture the current form sometimes and then other times it wont capture a current form depending on the appllication that is running the form. Is there a way that applications can hide from having a screen capture as it only works with certain applications, for example the visual studio forms, explorer or firefox browser, any windows form etc it works fine. I am able to pick up the thread and title name of any form but can't capture every form, some are dismissed.

The rest of my code looks like this:

Code:




Public Class Form1

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        'clear clipboard
        Windows.Forms.Clipboard.Clear()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'clear clipboard before we begin
        Windows.Forms.Clipboard.Clear()

        KeyboardSimulator.SimulateKeyDown(Keys.LWin)
        KeyboardSimulator.SimulateKeyDown(Keys.D)
        KeyboardSimulator.SimulateKeyUp(Keys.LWin)
        KeyboardSimulator.SimulateKeyUp(Keys.D)

        'minimze starting window
        'Me.WindowState = FormWindowState.Minimized
        'turn on timer
        Timer1.Enabled = True
    End Sub

    Public Class KeyboardSimulator

        <Runtime.InteropServices.DllImport("user32")> _
        Private Shared Sub keybd_event(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
        End Sub

        Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1
        Private Const KEYEVENTF_KEYUP As Integer = &H2

        Public Shared Sub SimulateKeyDown(ByVal vKey As Keys)
            keybd_event(CByte(vKey), 0, KEYEVENTF_EXTENDEDKEY, 0)
        End Sub

        Public Shared Sub SimulateKeyUp(ByVal vKey As Keys)
            keybd_event(CByte(vKey), 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
        End Sub

    End Class

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        SendKeys.Send("%" + "{PRTSC}")

        PasteImage()
        'timer currently at 500 milliseconds
        'every half second
        'capture active form
        If PictureBox1.Image IsNot Nothing Then

            Dim TempBitmap As Bitmap
            TempBitmap = PictureBox1.Image

            Dim MyColor As Color
            MyColor = TempBitmap.GetPixel(10, 10)

            'Dim str As String
            'str = MyColor.ToString
            Dim str2 As String

            str2 = ColorTranslator.ToHtml(MyColor)

            Dim str As String
            str = MyColor.ToString

            txtColour.Text = str2

            If str2 IsNot "#3A6EA5" Then

                SendKeys.Send("%" + "{PRTSC}")

                'SendKeys.Send("{PRTSC}") dosen't work in vista
                'or with certain keyboards
                'pasting copied image to the picturebox
                PasteImage()

            End If

        End If


    End Sub

    Public Sub PasteImage()
        'check the data format in clipboard if its of type bitmap then proceed further 
        If Clipboard.GetDataObject.GetDataPresent(DataFormats.Bitmap) Then
            'setting clipboard data to picturebox
            Me.PictureBox1.Image = Clipboard.GetDataObject.GetData(DataFormats.Bitmap)
        End If
    End Sub


    Private Declare Function GetForegroundWindow Lib "user32.dll" () As IntPtr
    Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As IntPtr, ByRef lpdwProcessID As Integer) As Integer
    Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hWnd As IntPtr, ByVal WinTitle As String, ByVal MaxLength As Integer) As Integer
    Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Integer

    Private Sub timerActiveWindowCheck_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Get the Handle to the Current Forground Window 
        Dim hWnd As IntPtr = GetForegroundWindow()

        If hWnd = IntPtr.Zero Then Exit Sub

        'Find the Length of the Window's Title
        Dim TitleLength As Integer

        TitleLength = GetWindowTextLength(hWnd)

        'Find the Window's Title
        Dim WindowTitle As String = StrDup(TitleLength + 1, "*")

        GetWindowText(hWnd, WindowTitle, TitleLength + 1)

        'Find the PID of the Application that Owns the Window 
        Dim pid As Integer = 0

        GetWindowThreadProcessId(hWnd, pid)

        If pid = 0 Then Exit Sub

        'Get the actual PROCESS from the process ID
        Dim proc As Process = Process.GetProcessById(pid)

        If proc Is Nothing Then Exit Sub

        txtProcessID.Text = pid.ToString
        txtProcessName.Text = proc.ProcessName
        txtProcessTitle.Text = proc.MainWindowTitle
        txtCurrentWindowTitle.Text = WindowTitle
        txtTitleLength.Text = TitleLength.ToString

    End Sub

End Class

Perhaps there is a way of capturing a form based upon a thread. Any one else experienced anything like this?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 06-18-2009, 5:36 AM
VB.NET Forum Newbie
.NET Framework: .NET 2.0 (VS 2005)
 
Join Date: Jun 2009
Posts: 16
Reputation: 10
mcfly is on a distinguished programming path ahead
Default

Is there another way to capture the current form?...rather than using sendkeys or print screen etc
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply

Bookmarks


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On





All times are GMT -4. The time now is 10:32 AM.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.2


For advertising opportunities click here.