+ Reply to Thread
Results 1 to 2 of 2

Thread: Capturing forms using sendkeys

  1. #1
    mcfly is offline VB.NET Forum Enthusiast mcfly is on a distinguished programming path ahead
    .NET Framework
    .NET 2.0 (VS 2005)
    Join Date
    Jun 2009
    Posts
    48
    Reputation
    17

    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?

  2. #2
    mcfly is offline VB.NET Forum Enthusiast mcfly is on a distinguished programming path ahead
    .NET Framework
    .NET 2.0 (VS 2005)
    Join Date
    Jun 2009
    Posts
    48
    Reputation
    17

    Default

    Is there another way to capture the current form?...rather than using sendkeys or print screen etc

+ Reply to Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Bookmarks

Posting Permissions

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