Май 31, 2014 - Уроки Visual Basic.NET Написать комментарий
Скриншот активного окна
Сегодня попробуем написать простой скриншотер активных окон. Работать будем, практически с одним Windows API. Ииспользуем такие функции:
- RegisterHotKey - определяем (регистрируем) глобальную клавишу
- UnregisterHotKey - освобождаем клавишу
- GetForegroundWindow - функция возвращает Handle активного окна
- GetWindowRect - узнаем размеры окна
- RECT - структура, которую требует GetWindowRect для извлечения размера окна
Приступаем
Создаем новый проект, на форму кидаем кнопку.
На проектировании все, теперь код.
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 и сохраняем.
Похожие записи:
Метки: скриншот, скриншот активного окна
Евгений
Просмотров: 66 318
Запись опубликована в 16:42