# OnClipboardChange

## OnClipboardChange() [v1.1.20+]

注册一个每当剪贴板内容发生改变时都会运行的函数或函数对象.

    OnClipboardChange(Func , AddRemove)

### 参数

Func

  要调用的函数或函数对象名称. 函数的参数和返回值如下所述.

AddRemove

  如果为空或省略, 则默认为 1(在先前任意的注册函数之后调用该函数). 否则, 请指定以下数字之一:

  - 1 = 在先前任意的注册函数之后调用该函数.
  - -1 = 在先前任意的注册函数之前调用该函数.
  - 0 = 不调用该函数.

  如果存在 OnClipboardChange 标签, 它总是会被率先调用.

### Func

    FunctionName(Type)

Type

  下列数值之一:

  - 0 = 剪贴板当前为空.
  - 1 = 剪贴板包含可以用文本形式表示的内容(包括从资源管理器窗口复制的文件).
  - 2 = 剪贴板包含完全是非文本的内容, 例如图片.
返回值

  如果这是最近的或仅有的 OnClipboardChange 函数, 其返回值会被忽略. 否则, 此函数会返回一个非零整数来阻止随后的函数被调用.

## OnClipboardChange 标签

过时的: 不推荐在新脚本中使用这种方法. 使用 OnClipboardChange 函数代替.

当任何程序(甚至脚本本身) 改变了剪贴板内容时一个以 OnClipboardChange 命名的标签(如果存在) 会自动执行. 这个标签在脚本启动时也会执行一次.

内置变量 A_EventInfo 包含以下数值之一:

- 0 = 剪贴板当前为空.
- 1 = 剪贴板包含可以用文本形式表示的内容(包括从资源管理器窗口复制的文件).
- 2 = 剪贴板包含完全是非文本的内容, 例如图片.

## 备注

在 OnClipboardChange 函数或标签正在运行时如果剪贴板内容改变, 这时的剪贴板通知事件会丢失. 如果不希望这样, 在标签的首行指定 Critical. 不过, 这样做也会缓冲/延迟在 OnClipboardChange 线程运行期间产生的其他线程的运行(例如热键的按击).

如果是脚本本身改变了剪贴板内容, 脚本中的 OnClipboardChange 函数或标签通常不会立即执行; 也就是说紧接在改变剪贴板命令后面的命令就像提前运行了一样. 要强制立即执行这个函数或标签, 请在改变剪贴板内容后使用短暂的延迟, 例如 `Sleep 20`.

## 相关

Clipboard, OnExit(), OnExit, OnMessage(), RegisterCallback()

## 示例

函数 vs. 标签.

尽管方法不同, 但这两个例子都有相同的效果; 即, 用简短的 ToolTip 显示每次剪贴板的更改. 注意, 脚本首次启动时不会马上调用此函数; 仅当剪贴板的内容发生改变时才会调用该函数.

    #Persistent
    OnClipboardChange("ClipChanged")
    return

    ClipChanged(Type) {
        ToolTip Clipboard data type: %Type%
        Sleep 1000
        ToolTip  ; 关闭提示.
    }

    #Persistent
    return

    OnClipboardChange:
    ToolTip Clipboard data type: %A_EventInfo%
    Sleep 1000
    ToolTip  ; 关闭提示.
    return

dftg