vb2003用API如何实现从剪切板保存图片,从网上找了资料但没有效果

gzwlj2001 2015-08-23 11:50:07
.net2005以上版本很容易实现,但2003很难只能用API,以下代码不出错也没效果,请指导 一下,谢谢

Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hPal As Long, ByVal BITMAP As Long) As Long
Private Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal FileName As String, ByVal clsidEncoder As Guid, ByVal encoderParams As Object) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, ByVal id As Guid) As Long

Private Sub btnCopyPhoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hBitmap, hDib As Long
Dim CF_BITMAP As Integer = 2
Dim CF_DIB As Integer = 8
Dim IMAGE_BITMAP As Integer = 0
Dim LR_LOADFROMFILE As Integer = 16
Dim ubitmap As Long

OpenClipboard(0)
hBitmap = GetClipboardData(CF_BITMAP)
hDib = GetClipboardData(CF_DIB)
CloseClipboard()
GdipCreateBitmapFromHBITMAP(hBitmap, 0, ubitmap)
Dim lcOutputFile As String = "d:\test.bmp"
Dim qEncoderClsID_BMP As Guid
#Const qEncoderClsID_BMP = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
GdipSaveImageToFile(ubitmap, lcOutputFile, qEncoderClsID_BMP, Nothing)
OpenClipboard(0)
EmptyClipboard()
CloseClipboard()
If System.IO.File.Exists(lcOutputFile) Then
Me.Photo.Image.FromFile(lcOutputFile)
End If
End Sub
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-08-25
  • 打赏
  • 举报
回复
没有 VS2003,还好有Snippet Compiler
imports Microsoft.VisualBasic
imports System
imports System.Drawing
imports System.Windows.Forms

public module MyModule
sub Main
try
If ContainsImage() Then
Dim img As Image = GetImage()
img.Save( "d:\test.bmp")
Console.WriteLine("Saved")
Else
Console.WriteLine("No Image")
End If
catch e as System.Exception
Console.WriteLine("{0}", e.Message)
end try
Console.ReadLine()
end sub

'下面是用 .NET Reflector 从 Clipboard 取得的两个 Shared 函数'
Public Function ContainsImage() As Boolean
Dim dataObject As IDataObject = Clipboard.GetDataObject
Return ((Not dataObject Is Nothing) AndAlso dataObject.GetDataPresent(DataFormats.Bitmap, True))
End Function


Public Function GetImage() As Image
Dim dataObject As IDataObject = Clipboard.GetDataObject
If (Not dataObject Is Nothing) Then
Return DirectCast(dataObject.GetData("Bitmap", True),Image)
End If
Return Nothing
End Function

end module
gzwlj2001 2015-08-25
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
简单的事情搞这么复杂
        Private Sub btnCopyPhoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Clipboard.ContainsImage() Then
            Dim img As Image = Clipboard.GetImage()
            img.Save( "d:\test.bmp")
            Me.Photo.Image = img
        End If
    End Sub
老大,我都说了是 .net2003 2003 Clipboard是没有GetImage这个方法的
gzwlj2001 2015-08-24
  • 打赏
  • 举报
回复
引用 1 楼 FoxDave 的回复:
调试一下看看 有没有可能是权限的问题
不权限问题,连文件也没产生
Justin-Liu 2015-08-24
  • 打赏
  • 举报
回复
调试一下看看 有没有可能是权限的问题
Tiger_Zhao 2015-08-24
  • 打赏
  • 举报
回复
简单的事情搞这么复杂
        Private Sub btnCopyPhoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Clipboard.ContainsImage() Then
Dim img As Image = Clipboard.GetImage()
img.Save( "d:\test.bmp")
Me.Photo.Image = img
End If
End Sub

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧