Скриншот активного окна

Сегодня попробуем написать простой скриншотер активных окон. Работать будем, практически с одним Windows API. Ииспользуем такие функции:

  • RegisterHotKey - определяем (регистрируем) глобальную клавишу
  • UnregisterHotKey - освобождаем клавишу
  • GetForegroundWindow - функция возвращает Handle активного окна
  • GetWindowRect - узнаем размеры окна
  • RECT - структура, которую требует GetWindowRect для извлечения размера окна

Приступаем

Создаем новый проект, на форму кидаем кнопку.

img form Скриншот активного окна

На проектировании все, теперь код.

Imports System.Runtime.InteropServices
Public Class Form1
    ' хоткей
    Public Declare Auto Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
    Public Declare Auto Function UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
    ' handle активного окна
    Declare Function GetForegroundWindow Lib "user32" Alias _
"GetForegroundWindow" () As Integer
    ' размеры окна
    <DllImport("user32.dll")> _
  Private Shared Function GetWindowRect(ByVal hWnd As HandleRef, ByRef lpRect As RECT) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
    'структура rectangle не подходит
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure RECT
        Public Left As Integer
        Public Top As Integer
        Public Right As Integer
        Public Bottom As Integer
    End Structure
    Private winRect As New Rectangle()
    Private Const WM_HOTKEY As Integer = &H312
    Function CaptureWindow(ByVal WindowHandle As IntPtr)
        ' формируем
        Dim rct As RECT ' размер окна ->
        GetWindowRect(New HandleRef(WindowHandle, WindowHandle), rct) ' rct - получаем размеры окна
        winRect = New Rectangle(New Point(rct.Left, rct.Top), New Size(rct.Right - rct.Left, rct.Bottom - rct.Top))
        ' сама картинка
        Dim bmp As New Bitmap(winRect.Width, winRect.Height)
        Dim g As Graphics = Graphics.FromImage(bmp)
        g.CopyFromScreen(New Point(winRect.Left, winRect.Top), New Point(0, 0), New Size(winRect.Width, winRect.Height))
        ' сохранение
        Dim sfd As New SaveFileDialog
        sfd.Filter = ".png|*.png"
        If sfd.ShowDialog = DialogResult.OK Then bmp.Save(sfd.FileName)
    End Function
    ' Отлавливаем нажание клавиши и вызываем функцию CaptureWindow
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        MyBase.WndProc(m)
        If (m.Msg = WM_HOTKEY) Then
            Dim hotKeyId As Integer = m.WParam.ToInt32()
            If hotKeyId = 1 Then
                CaptureWindow(GetForegroundWindow) ' вызов, параметр - handle окна
            End If
        End If
    End Sub
    ' освобождаем клавишу
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        UnregisterHotKey(Handle, 1)
    End Sub
    ' минимизурем окно и регистрируем клавишу ptsc
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        WindowState = FormWindowState.Minimized
        RegisterHotKey(Handle, 1, Nothing, Keys.PrintScreen)
    End Sub
End Class

Как же это работает? Делаем окно активным, нажимаем клавишу PrintScreen и сохраняем.

Загрузить проект

  Метки: ,
  Евгений
  Просмотров: 26 415
  Запись опубликована в 16:42

Есть что сказать? Тогда действуй!


:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-o :-P :-D :-? :) :( :!: 8-O 8)