當前位置:編程學習大全網 - 源碼下載 - vb 屏幕問題 跪求答案 請問我用壹下代碼 輸出圖片是空白呀 我想截取當前整個電腦屏幕

vb 屏幕問題 跪求答案 請問我用壹下代碼 輸出圖片是空白呀 我想截取當前整個電腦屏幕

'是妳的bitbit用法有問題,下面是修改後的代碼:

Option Explicit

Private Type PALETTEENTRY

peRed As Byte

peGreen As Byte

peBlue As Byte

peFlags As Byte

End Type

Private Type LOGPALETTE

palVersion As Integer

palNumEntries As Integer

palPalEntry(255) As PALETTEENTRY

End Type

Private Type GUID

Data1 As Long

Data2 As Integer

Data3 As Integer

Data4(7) As Byte

End Type

Private Const RASTERCAPS As Long = 38

Private Const RC_PALETTE As Long = &H100

Private Const SIZEPALETTE As Long = 104

Private Type RECT

Left As Long

Top As Long

Right As Long

Bottom As Long

End Type

Private Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "GDI32" (ByVal hDC As Long, _

ByVal nWidth As Long, ByVal nHeight As Long) As Long

Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal _

iCapabilitiy As Long) As Long

Private Declare Function GetSystemPaletteEntries Lib "GDI32" (ByVal hDC As Long, _

ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries _

As PALETTEENTRY) As Long

Private Declare Function CreatePalette Lib "GDI32" (lpLogPalette As LOGPALETTE) _

As Long

Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal hObject _

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 DeleteDC Lib "GDI32" (ByVal hDC As Long) As Long

Private Declare Function GetForegroundWindow Lib "user32" () As Long

Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal hPalette _

As Long, ByVal bForceBackground As Long) As Long

Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long

Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As _

RECT) As Long

Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As _

Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Type PicBmp

Size As Long

Type As Long

hBmp As Long

hPal As Long

Reserved As Long

End Type

Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As _

PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Dim ComputerName As String '本機名稱,用來區分不同的機器所生成的圖像。

'創建BMP位圖

Public Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture

Dim r As Long

Dim Pic As PicBmp

Dim IPic As IPicture

Dim IID_IDispatch As GUID

'填充IDispatch界面

With IID_IDispatch

.Data1 = &H20400

.Data4(0) = &HC0

.Data4(7) = &H46

End With

'填充Pic

With Pic

.Size = Len(Pic) '註釋: Pic結構長度

.Type = vbPicTypeBitmap '註釋: 圖象類型

.hBmp = hBmp '註釋: 位圖句柄

.hPal = hPal '註釋: 調色板句柄

End With

'建立Picture圖象

r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

'返回Picture對象

Set CreateBitmapPicture = IPic

End Function

'截圖處理

Public Function CaptureWindow(ByVal hWndSrc As Long, ByVal Client As Boolean, ByVal _

LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc _

As Long) As Picture

Dim hDCMemory As Long '保存截取圖象的目標設備

Dim hBmp As Long

Dim hBmpPrev As Long

Dim r As Long

Dim hDCSrc As Long '要截取圖象的源設備

Dim hPal As Long

Dim hPalPrev As Long

Dim RasterCapsScrn As Long

Dim HasPaletteScrn As Long

Dim PaletteSizeScrn As Long

Dim LogPal As LOGPALETTE

'GetDC傳回用於寫入窗口顯示區域的設備內容句柄,而GetWindowDC傳回寫入整個窗口的設備內容句柄

'區別在於GetDC不包括邊框、滾動條、標題欄、菜單等,而GetWindowDC則包括

If Client Then '如果為真,即指定是客戶區(不包括標題欄等)

hDCSrc = GetDC(hWndSrc) 'GetDC檢索壹指定窗口的客戶區域或整個屏幕的顯示設備上下文的句柄

Else '否則用GetWindowDC尋找後獲取

hDCSrc = GetWindowDC(hWndSrc)

End If

hDCMemory = CreateCompatibleDC(hDCSrc) '創建壹塊與hDCSrc設備場景壹樣的內存區

hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc) '創建壹幅與設備有關位圖

hBmpPrev = SelectObject(hDCMemory, hBmp) 'SelectObject將位圖放入設備場景中

'獲得屏幕屬性

RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS) '根據指定設備場景代表的設備的功能返回信息

HasPaletteScrn = RasterCapsScrn And RC_PALETTE

PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE)

'如果屏幕對象有調色板則獲得屏幕調色板

If HasPaletteScrn And (PaletteSizeScrn = 256) Then

'建立屏幕調色板的拷貝

LogPal.palVersion = &H300

LogPal.palNumEntries = 256

r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0)) '獲取系統調色板

hPal = CreatePalette(LogPal) 'CreatePalette調色板函數

'將新建立的調色板選入建立的內存繪圖句柄中

hPalPrev = SelectPalette(hDCMemory, hPal, 0)

r = RealizePalette(hDCMemory) 'RealizePalette函數使系統恢復當前選中的邏輯調色板中的值

End If

'拷貝圖象

r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)

hBmp = SelectObject(hDCMemory, hBmpPrev)

If HasPaletteScrn And (PaletteSizeScrn = 256) Then

hPal = SelectPalette(hDCMemory, hPalPrev, 0)

End If

'釋放資源

r = DeleteDC(hDCMemory)

r = ReleaseDC(hWndSrc, hDCSrc)

Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)

End Function

Private Sub Form_Load()

Dim sBuffer As String

Dim lSize As Long

sBuffer = Space$(255)

lSize = Len(sBuffer)

Call GetComputerName(sBuffer, lSize)

ComputerName = Trim(Left$(sBuffer, lSize))

End Sub

Private Sub Timer1_Timer()

Dim hWndScreen As Long, CaptureScreen As StdPicture

'獲得桌面的窗口句柄

hWndScreen = GetDesktopWindow()

Set CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, Screen.Width _

\ Screen.TwipsPerPixelX, Screen.Height \ Screen.TwipsPerPixelY)

SavePicture CaptureScreen, "\\WWW-94E37D893B8\D$\ClientScreen\image" & ComputerName & ".bmp"

Call iniPara

End Sub

'當發現有異常情況時,往往需要縮短采樣間隔,下面iniPara函數可實現改變定時器的Interval屬性的功能。

Private Function iniPara() '讀取服務器上的Client.ini文件,初使化定時器的間隔。

Dim sBuffer As String

Dim lSize As Long

Dim TimerInterval As Integer '采樣間隔

Open "\\WWW-94E37D893B8\D$\ClientScreen\Client.ini" For Input As #1

Line Input #1, sBuffer

lSize = InStr(1, sBuffer, "=")

Timer1.Interval = Val(Mid(sBuffer, lSize + 1))

Close (1)

End Function

  • 上一篇:鞍山品牌源代碼出售
  • 下一篇:在別的世界裏歌唱雙語散文欣賞
  • copyright 2024編程學習大全網