📄 modscreen.bas
字号:
Attribute VB_Name = "modScreen"
Option Explicit
Type POINTAPI
x As Long
y As Long
End Type
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDCDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hDCSrc As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Dim pt As POINTAPI
Private Enum IJLERR
'// The following "error" values indicate an "OK" condition.
IJL_OK = 0
IJL_INTERRUPT_OK = 1
IJL_ROI_OK = 2
'// The following "error" values indicate an error has occurred.
IJL_EXCEPTION_DETECTED = -1
IJL_INVALID_ENCODER = -2
IJL_UNSUPPORTED_SUBSAMPLING = -3
IJL_UNSUPPORTED_BYTES_PER_PIXEL = -4
IJL_MEMORY_ERROR = -5
IJL_BAD_HUFFMAN_TABLE = -6
IJL_BAD_QUANT_TABLE = -7
IJL_INVALID_JPEG_PROPERTIES = -8
IJL_ERR_FILECLOSE = -9
IJL_INVALID_FILENAME = -10
IJL_ERROR_EOF = -11
IJL_PROG_NOT_SUPPORTED = -12
IJL_ERR_NOT_JPEG = -13
IJL_ERR_COMP = -14
IJL_ERR_SOF = -15
IJL_ERR_DNL = -16
IJL_ERR_NO_HUF = -17
IJL_ERR_NO_QUAN = -18
IJL_ERR_NO_FRAME = -19
IJL_ERR_MULT_FRAME = -20
IJL_ERR_DATA = -21
IJL_ERR_NO_IMAGE = -22
IJL_FILE_ERROR = -23
IJL_INTERNAL_ERROR = -24
IJL_BAD_RST_MARKER = -25
IJL_THUMBNAIL_DIB_TOO_SMALL = -26
IJL_THUMBNAIL_DIB_WRONG_COLOR = -27
IJL_RESERVED = -99
End Enum
Private Enum IJLIOTYPE
IJL_SETUP = -1&
''// Read JPEG parameters (i.e., height, width, channels,
''// sampling, etc.) from a JPEG bit stream.
IJL_JFILE_READPARAMS = 0&
IJL_JBUFF_READPARAMS = 1&
''// Read a JPEG Interchange Format image.
IJL_JFILE_READWHOLEIMAGE = 2&
IJL_JBUFF_READWHOLEIMAGE = 3&
''// Read JPEG tables from a JPEG Abbreviated Format bit stream.
IJL_JFILE_READHEADER = 4&
IJL_JBUFF_READHEADER = 5&
''// Read image info from a JPEG Abbreviated Format bit stream.
IJL_JFILE_READENTROPY = 6&
IJL_JBUFF_READENTROPY = 7&
''// Write an entire JFIF bit stream.
IJL_JFILE_WRITEWHOLEIMAGE = 8&
IJL_JBUFF_WRITEWHOLEIMAGE = 9&
''// Write a JPEG Abbreviated Format bit stream.
IJL_JFILE_WRITEHEADER = 10&
IJL_JBUFF_WRITEHEADER = 11&
''// Write image info to a JPEG Abbreviated Format bit stream.
IJL_JFILE_WRITEENTROPY = 12&
IJL_JBUFF_WRITEENTROPY = 13&
''// Scaled Decoding Options:
''// Reads a JPEG image scaled to 1/2 size.
IJL_JFILE_READONEHALF = 14&
IJL_JBUFF_READONEHALF = 15&
''// Reads a JPEG image scaled to 1/4 size.
IJL_JFILE_READONEQUARTER = 16&
IJL_JBUFF_READONEQUARTER = 17&
''// Reads a JPEG image scaled to 1/8 size.
IJL_JFILE_READONEEIGHTH = 18&
IJL_JBUFF_READONEEIGHTH = 19&
''// Reads an embedded thumbnail from a JFIF bit stream.
IJL_JFILE_READTHUMBNAIL = 20&
IJL_JBUFF_READTHUMBNAIL = 21&
End Enum
Private Type JPEG_CORE_PROPERTIES_VB ' Sadly, due to a limitation in VB (UDT variable count)
' we can't encode the full JPEG_CORE_PROPERTIES structure
UseJPEGPROPERTIES As Long '// default = 0
'// DIB specific I/O data specifiers.
DIBBytes As Long '; '// default = NULL 4
DIBWidth As Long '; '// default = 0 8
DIBHeight As Long '; '// default = 0 12
DIBPadBytes As Long '; '// default = 0 16
DIBChannels As Long '; '// default = 3 20
DIBColor As Long '; '// default = IJL_BGR 24
DIBSubsampling As Long '; '// default = IJL_NONE 28
'// JPEG specific I/O data specifiers.
JPGFile As Long 'LPTSTR JPGFile; 32 '// default = NULL
JPGBytes As Long '; '// default = NULL 36
JPGSizeBytes As Long '; '// default = 0 40
JPGWidth As Long '; '// default = 0 44
JPGHeight As Long '; '// default = 0 48
JPGChannels As Long '; '// default = 3
JPGColor As Long '; '// default = IJL_YCBCR
JPGSubsampling As Long '; '// default = IJL_411
JPGThumbWidth As Long ' ; '// default = 0
JPGThumbHeight As Long '; '// default = 0
'// JPEG conversion properties.
cconversion_reqd As Long '; '// default = TRUE
upsampling_reqd As Long '; '// default = TRUE
jquality As Long '; '// default = 75. 100 is my preferred quality setting.
'// Low-level properties - 20,000 bytes. If the whole structure
' is written out then VB fails with an obscure error message
' "Too Many Local Variables" !
'
' These all default if they are not otherwise specified so there
' is no trouble to just assign a sufficient buffer in memory:
jprops(0 To 19999) As Byte
End Type
Private Declare Function ijlInit Lib "remote.dll" (jcprops As Any) As Long
Private Declare Function ijlFree Lib "remote.dll" (jcprops As Any) As Long
Private Declare Function ijlRead Lib "remote.dll" (jcprops As Any, ByVal ioType As Long) As Long
Private Declare Function ijlWrite Lib "remote.dll" (jcprops As Any, ByVal ioType As Long) As Long
Private Declare Function ijlGetLibVersion Lib "remote.dll" () As Long
Private Declare Function ijlGetErrorString Lib "remote.dll" (ByVal code As Long) As Long
' Win32 Declares
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Const GMEM_DDESHARE = &H2000
Private Const GMEM_DISCARDABLE = &H100
Private Const GMEM_DISCARDED = &H4000
Private Const GMEM_FIXED = &H0
Private Const GMEM_INVALID_HANDLE = &H8000
Private Const GMEM_LOCKCOUNT = &HFF
Private Const GMEM_MODIFY = &H80
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_NOCOMPACT = &H10
Private Const GMEM_NODISCARD = &H20
Private Const GMEM_NOT_BANKED = &H1000
Private Const GMEM_NOTIFY = &H4000
Private Const GMEM_SHARE = &H2000
Private Const GMEM_VALID_FLAGS = &H7F72
Private Const GMEM_ZEROINIT = &H40
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
' Stuff for replacing a file when you have to Kill the original:
Private Const MAX_PATH = 260
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
Private Declare Function lclose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long
Private Declare Function SetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Private Const OF_WRITE = &H1
Private Const OF_SHARE_DENY_WRITE = &H20
Private Const GENERIC_WRITE = &H40000000
Private Const GENERIC_READ = &H80000000
Private Const FILE_SHARE_WRITE = &H2
Private Const CREATE_ALWAYS = 2
Private Const FILE_BEGIN = 0
Private Const SECTION_MAP_WRITE = &H2
Public Function SaveJPG(ByRef cDIB As cDIBSection, ByVal sFile As String, Optional ByVal lQuality As Long = 90) As Boolean
On Error Resume Next
Dim tJ As JPEG_CORE_PROPERTIES_VB
Dim bFile() As Byte
Dim lPtr As Long
Dim lR As Long
Dim tFnd As WIN32_FIND_DATA
Dim hFile As Long
Dim bFileExisted As Boolean
Dim lFileSize As Long
hFile = -1
lR = ijlInit(tJ)
If lR = IJL_OK Then
bFileExisted = (FindFirstFile(sFile, tFnd) <> -1)
If bFileExisted Then
On Error Resume Next
Kill sFile
End If
tJ.DIBWidth = cDIB.Width
tJ.DIBHeight = -cDIB.Height
tJ.DIBBytes = cDIB.DIBSectionBitsPtr
tJ.DIBPadBytes = cDIB.BytesPerScanLine - cDIB.Width * 3
bFile = StrConv(sFile, vbFromUnicode)
ReDim Preserve bFile(0 To UBound(bFile) + 1) As Byte
bFile(UBound(bFile)) = 0
lPtr = VarPtr(bFile(0))
CopyMemory tJ.JPGFile, lPtr, 4
tJ.JPGWidth = cDIB.Width
tJ.JPGHeight = cDIB.Height
tJ.jquality = lQuality
lR = ijlWrite(tJ, IJL_JFILE_WRITEWHOLEIMAGE)
If lR = IJL_OK Then
If bFileExisted Then
hFile = lopen(sFile, OF_WRITE Or OF_SHARE_DENY_WRITE)
If hFile = 0 Then
' problem
Else
SetFileTime hFile, tFnd.ftCreationTime, tFnd.ftLastAccessTime, tFnd.ftLastWriteTime
lclose hFile
SetFileAttributes sFile, tFnd.dwFileAttributes
End If
End If
lFileSize = tJ.JPGSizeBytes - tJ.JPGBytes
SaveJPG = True
Else
Err.Raise 26001, App.EXEName & ".mIntelJPEGLibrary", "Failed to save to JPG " & lR, vbExclamation
End If
ijlFree tJ
Else
Err.Raise 26001, App.EXEName & ".mIntelJPEGLibrary", "Failed to initialise the IJL library: " & lR
End If
End Function
Sub PrintScreen(picTmp As Object, Optional WidthDesk As Long = -1, Optional HeightDesk As Long = -1, Optional FollowCursor As Boolean, Optional ShowCursor As Boolean = True)
On Error Resume Next
Dim pt As POINTAPI
Dim hWndDesk As Long
Dim hDCDesk As Long
picTmp.Cls
If WidthDesk <= 0 Then WidthDesk = Screen.Width \ Screen.TwipsPerPixelX
If HeightDesk <= 0 Then HeightDesk = Screen.Height \ Screen.TwipsPerPixelY
hWndDesk = GetDesktopWindow()
hDCDesk = GetWindowDC(hWndDesk)
Dim h As Long, W As Long
h = HeightDesk / 2
W = WidthDesk / 2
GetCursorPos pt
If FollowCursor Then
Call BitBlt(picTmp.hdc, 0, 0, WidthDesk, HeightDesk, hDCDesk, pt.x - h, pt.y - W, vbSrcCopy)
Else
Call BitBlt(picTmp.hdc, 0, 0, WidthDesk, HeightDesk, hDCDesk, 0, 0, vbSrcCopy)
End If
'StretchBlt picTmp.hdc, 0, 0, WidthDesk, HeightDesk, GetDC(0&), 0, 0, WidthDesk, HeightDesk, vbSrcCopy
'picTmp.Picture = picTmp.Image
If ShowCursor Then Call BitBlt(picTmp.hdc, pt.x, pt.y, 32, 32, Form1.picCursor.hdc, 0, 0, vbSrcAnd)
picTmp.Picture = picTmp.Image
' MAIN.Picture1.Picture = picTmp.Image
End Sub
Function StripPath(nPath As String) As String
If Right(nPath, 1) = "\" Then
StripPath = nPath
Else
StripPath = nPath & "\"
End If
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -