函数参考


_ClipBoard_SetDataEx

使用一个指定的剪切板格式替换剪切板中的数据

#Include <Clipboard.au3>
_ClipBoard_SetDataEx(ByRef $hMemory [, $iFormat = 1])

参数

$hMemory 指定格式的数据句柄. 该参数可以是 NULL(空), 表明窗口按指定的剪贴板格式要求提供数据
如果窗口延迟执行, 表明必须处理 $WM_RENDERFORMAT?和 $WM_RENDERALLFORMATS 信息
果此函数调用成功: $hMemory 参数确定的对象
一旦数据所有权已经转移到系统, 应用程序可能无法写入或释放数据,
但是可以锁定和读取, 直到调用 _ClipBoard_Close 函数时为止
关闭剪贴板前, 内存必须解锁.
如果 $hMemory 参数标识为一个内存对象,
对象必须使用函数与 $GMEM_MOVEABLE 标记关联.
$iFormat [可选参数] 指定剪切板格式:
$CF_TEXT - 文本格式
$CF_BITMAP - 位图句柄 (HBITMAP)
$CF_METAFILEPICT - 图片的图元文件句柄 (METAFILEPICT)
$CF_SYLK - Microsoft 符号链接格式 (SYLK)
$CF_DIF - 软件艺术数据( Arts' Data )交换格式
$CF_TIFF - 标记映像文件格式
$CF_OEMTEXT - OEM 字符集中包含字符的文本格式
$CF_DIB - 图位的 BITMAPINFO 结构
$CF_PALETTE - 调色板句柄
$CF_PENDATA - 扩展画笔计算数据
$CF_RIFF - RIFF 格式音频数据
$CF_WAVE - WAVE 格式音频数据
$CF_UNICODETEXT - Unicode 文本格式
$CF_ENHMETAFILE - 增强型图元文件句柄 (HENHMETAFILE)
$CF_HDROP - 识别文件列表的 HDROP 句柄
$CF_LOCALE - 与剪贴板文本相关的标识符句柄
$CF_DIBV5 - 带位图颜色和图位的 BITMAPV5HEADER 结构
$CF_OWNERDISPLAY - 属主显示格式
$CF_DSPTEXT - 与私有格式相关的文字显示格式
$CF_DSPBITMAP - 与私有格式相关的位图显示格式
$CF_DSPMETAFILEPICT - 与私有格式相关的图元显示格式
$CF_DSPENHMETAFILE - 与私有格式相关的增强型图元显示格式

返回值

成功: 返回数据句柄
失败: 返回 0

注意/说明

$iFormat 参数可以是已注册剪贴板格式,也可以是标准剪贴板格式.
如果一个应用程序调用函数响应 $WM_RENDERFORMAT 或 $WM_RENDERALLFORMATS,
在此函数被调用后, 应用程序有可能不使用句柄.
如果一个应用程序调用 _ClipBoard_Open 函数并设置一个 NULL(空) 句柄, 同时 _ClipBoard_Empty 设置剪贴板所有者也为 NULL(空); 此时将导致此函数失败

相关

_ClipBoard_Empty, _ClipBoard_GetData, _ClipBoard_Open, _ClipBoard_SetData

详情参考

在MSDN中搜索


示例/演示


#include <GUIConstantsEx.au3>
#include <Clipboard.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $iMemo

_Main()

Func _Main()
    Local $btn_SetData, $btn_GetData, $hMemory, $hLock, $tData, $sData, $iSize

    ; 创建 GUI
    GUICreate("Clipboard", 600, 450)
    $iMemo = GUICtrlCreateEdit("", 2, 2, 596, 396, $WS_VSCROLL)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    $btn_SetData = GUICtrlCreateButton("Set ClipBoard Data", 150, 410, 120, 30)
    $btn_GetData = GUICtrlCreateButton("Get ClipBoard Data", 300, 410, 120, 30)
    GUISetState()

    ; 循环直到用户退出
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $btn_SetData
                ; 打开剪贴板
                If _ClipBoard_Open(0) Then

                    ; 清空剪贴板
                    If _ClipBoard_Empty() Then

                        ; 创建全局的内存缓冲区 (显示为什么使用 _ClipBoard_SetData 会更容易!)
                        $sData = "Hello from AutoIt"
                        $iSize = StringLen($sData) + 1
                        $hMemory = _MemGlobalAlloc($iSize, $GHND)
                        If $hMemory <> 0 Then
                            $hLock = _MemGlobalLock($hMemory)
                            If $hLock = 0 Then _WinAPI_ShowError("_Mem_GlobalLock failed")
                            $tData = DllStructCreate("char Text[" & $iSize & "]", $hLock)
                            DllStructSetData($tData, "Text", $sData)
                            _MemGlobalUnlock($hMemory)

                            ; 写入文本到剪贴板
                            If Not _ClipBoard_SetDataEx($hMemory, $CF_TEXT) Then _WinAPI_ShowError("_ClipBoard_SetDataEx failed")
                        Else
                            _WinAPI_ShowError("_Mem_GlobalAlloc failed")
                        EndIf

                        ; 关闭剪贴板
                        _ClipBoard_Close()
                    Else
                        ; 关闭剪贴板
                        _ClipBoard_Close()
                        _WinAPI_ShowError("_ClipBoard_Empty failed")
                    EndIf
                Else
                     _WinAPI_ShowError("_ClipBoard_Open 失败")
                EndIf

            Case $btn_GetData
                MemoWrite(_ClipBoard_GetData())
        EndSwitch
    WEnd

EndFunc   ;==>_Main

; 写入消息到 memo
Func MemoWrite($sMessage = "")
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite