65.9K
CodeProject 正在变化。 阅读更多。
Home

屏幕截图工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (11投票s)

2007年10月19日

CPOL

2分钟阅读

viewsIcon

58956

downloadIcon

3551

一个适用于开发人员以及普通用户的屏幕截图工具。

Screenshot - JPG_capture.jpg

引言

JPG Capture 是一个为开发人员设计的用于捕获调试截图的工具,同时它也适用于一般的屏幕截图目的。JPG Capture 可以将桌面屏幕捕获为连续的图片文件。用户可以定义捕获热键、捕获区域(当前窗口、全屏或矩形区域)、图片格式(JPG、GIF、BMP 等)以及目标位置。

设置热键

该程序使用 Win32 API 函数 RegisterHotKey 来设置系统范围的热键。

<DllImport("user32", EntryPoint:="RegisterHotKey", _
SetLastError:=True, _
ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Function RegisterHotkey(ByVal hwnd As IntPtr, _
    ByVal Id As Int32, _
    <MarshalAs(UnmanagedType.U4)> ByVal fsModifiers As Int32, _
    <MarshalAs(UnmanagedType.U4)> ByVal vkey As Int32) As Boolean
End Function

该程序将一个不可见窗口 inVisibleHotkey 的窗口句柄传递给 RegisterHotKey 函数。每当按下热键时,Windows 消息将被发送到 inVisibleHotkey 窗口,这将触发 HotKey_Press() 例程。

用户可以使用两个参数 fsModifiersvkey 定义热键组合。fsModifiers 可以是 Ctrl、Alt 或 Shift 键。vkey 可以是任何其他键。

Public Enum HotkeyModifierFlags
    MOD_ALT = &H1
    MOD_CONTROL = &H2
    MOD_SHIFT = &H4
    MOD_WIN = &H8
End Enum

Public Enum HotkeyVkeyFlags
    Key_O = &H4F
    Key_G = &H47
    Key_T = &H54
End Enum

定义捕获区域

捕获区域可以是当前窗口、全屏或矩形区域。

  • 当前窗口选项使用 Win32 API 函数 GetForegroundWindow 来定义捕获区域。
  • 全屏选项使用 Win32 API 函数 GetDesktopWindow 来定义捕获区域。
  • 矩形区域选项使用一个透明窗口 inVisibleCapWin 来定义捕获区域。当捕获开始时,inVisibleCapWin 窗口将被加载。用户可以使用鼠标绘制一个矩形来定义捕获区域。鼠标按钮释放后,inVisibleCapWin 窗口将被关闭并继续捕获过程。

捕获过程

该程序使用 Win32 API 函数 BitBlt 根据所选的捕获区域来捕获桌面屏幕。

<DllImport("gdi32.dll")> Public Shared _
Function BitBlt(ByVal hObject As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, _
        ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hObjectSource As IntPtr, _
        ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Integer) As Boolean
End Function

截图文件按顺序保存。该程序使用一个名为 makeup_filename 的例程来生成顺序文件名。

Function makeup_Filename(ByRef Scr_num As Integer, ByVal Dir_Path As String, _
            ByVal Prefix_fn As String, ByVal Subfix_fn As String) As String
'combine and generate the filename in sequence

    Dim FileName As String
    Dir_Path = Standardize_path(Dir_Path)
    If Not Directory.Exists(Dir_Path) Then
        Directory.CreateDirectory(Dir_Path)
        'make sure the directory do exist.

        Scr_num = 0
        'reset the picture number since the new dir is empty.
    End If

Next_num:

    If Scr_num < 0 Then Stop
    Scr_num = Scr_num + 1
    FileName = Dir_Path & Prefix_fn
    FileName = FileName & Format(Scr_num, "000")
    FileName = FileName & "." & Subfix_fn
        
    If File.Exists(FileName) Then GoTo Next_num
    'make sure NOT to overwrite the exsisting file

    Return FileName
End Function

配置文件

程序的设置被保存到一个名为 config.ini 的配置文件中。如果配置文件丢失,将创建默认配置文件。

    Dir_Path = C:\Lexer_trace\
    Prefix_fn = lexer
    Subfix_fn = jpg
    hotfsModifiers = 2
    hotVkey = 71
    Area = 2

未来改进

还有一些其他功能可以开发,例如在保存文件之前弹出预览窗口,根据需要调整截图文件的大小等。

© . All rights reserved.