在Visual Basic 6中,剪贴板具有各种格式。要从剪贴板检索HTML数据,这非常有效:https://support.microsoft.com/en-us/kb/274326
现在我的问题是,如何从拖动的数据而不是剪贴板中获取HTML信息?
例如,我想要一个多行文本框,当我将内容从网页拖到文本框中时,文本框将显示从OLE拖动信息中检索到的HTML,而不是vbCFtext。
我尝试使用与上面链接相同的技术但不使用GetClipboardData - 使用Data.GetData(RegisterClipboardFormat(“HTML Format”))[来自Picture1_OLEDragDrop(...] 但是我得到了一个过流错误。 我在网上搜索了一个解决方案。在那里的任何人?
编辑:上面已经回答了,谢谢!
添加: 非常感谢你!现在逆转这种情况的正确方法是什么?意思是,从文本框(包含HTML)拖动 - 并将其设置为在HTML模式下拖动?
当我简单地使用它时:
Private Sub Text1_OLEStartDrag(Data As DataObject,AllowedEffects As Long) 'Data.SetData StrConv(Text1.Text,vbFromUnicode),(CF_HTML) Data.SetData Text1.Text,(CF_HTML) 结束子
我收到错误: “与SetData一起使用的非内在OLE拖放格式需要Byte数组数据.GetData可能返回比给定SetData更多的字节(错误675)”
发回数据的准确方法是什么? 并注意,in可能有Unicode字符。 我是否必须使用内存副本和其他人来使其工作?非常感谢你的帮助!
答案 0 :(得分:1)
你的问题是RegisterClipboardFormat
返回一个Long(实际上是一个uint),但剪贴板格式是ushort(无符号整数)值。由于我们在VB6中没有这样的类型,因此我们的DataObject类型需要Integer值。因此,我们必须再玩几个游戏:
Option Explicit
Private Declare Function RegisterClipboardFormat Lib "user32" _
Alias "RegisterClipboardFormatW" ( _
ByVal lpString As Long) As Long
Private CF_HTML As Integer
Private Sub Form_Initialize()
Dim Temp As Long
Temp = RegisterClipboardFormat(StrPtr("HTML Format"))
CF_HTML = CInt(Temp And &H7FFF&) Or IIf(Temp And &H8000&, &H8000, 0)
End Sub
Private Sub Text1_OLEDragDrop( _
Data As DataObject, _
Effect As Long, _
Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
If Effect And vbDropEffectCopy Then
Text1.Text = StrConv(Data.GetData(CF_HTML), vbUnicode)
End If
End Sub
Private Sub Text1_OLEDragOver( _
Data As DataObject, _
Effect As Long, _
Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single, _
State As Integer)
If Data.GetFormat(CF_HTML) Then
Effect = vbDropEffectCopy
Else
Effect = vbDropEffectNone
End If
End Sub