DOS 程序读取Windows 的剪贴板数据
概述:
Windows 中剪贴板的功能给了我们很大的方便,但在 DOS 窗口下运行的程序如何利用剪贴板来获得数据呢?DOS
的 INT 2FH 中断提供了几个有关剪贴板操作的中断,以下是中断的资料和读取剪贴板文本数据的编程示例。经过修改大家很容易编出读取图形数据的程序。
本程序要用到的 INT 2FH 中断的 17xxH 功能如下:
功能号 | 入口参数 | 出口参数 |
AX = 1700H 检验是否支持剪贴板 |
AX = 1700H | AX = 1700H 不支持 |
AX <> 1700H 支持 | ||
AH = 1701H 打开剪贴板 |
AX = 1701H | AX <> 0 成功 |
AX = 0 剪贴板已打开 | ||
AH = 1702H 清空剪贴板 |
AX = 1702H | AX <> 0 成功 |
AX = 0 失败 | ||
AH = 1703H 将数据传入剪贴板 |
AX = 1703H | AX <> 0 成功 |
DX = 数据格式 1 = 文本 2 = Bitmap 3 = Metafile picture 4 = SYLK 5 = DIF 6 = TIFF 7 = OEM 文本 |
||
ES:BX 指向数据缓冲区 | AX = 0 失败 | |
SI:CX = 数据长度 | ||
AH = 1704H 取剪贴板数据长度 |
AX = 1704H | DX:AX = 剪贴板内数据长度 |
DX = 数据格式(详见1703的DX) | DX:AX = 0 剪贴板内无数据 | |
AH = 1705H 剪贴板数据 |
AX = 1705H | AX <> 0 成功 |
ES:BX 指向自己定义的数据缓冲区 | AX = 0 失败 | |
AH = 1708H 关闭剪贴板 |
AX = 1708H | AX <> 0 成功 |
AX = 0 失败 |
源程序:
;Copyright by LuoYunBin
;http://asm.yeah.net
;本程序未考虑剪贴板数据长度超过 60K 的情况!
.286
code segment
assume cs:code,ds:code
org 100h
start:
jmp install
d_clip db 'Length in clipboard is %ld bytes.',0dh,0ah,0ah db 'The text in clipboard is:',0dh,0ah db '-------------------------------------------',0dh,0ah db '%c',0dh,0ah db '-------------------------------------------',0dh,0ah,0 dw _length,buffer d_no_data db 'There is no data in clipboard!',0dh,0ah,0
_length dw ?,?
install: mov ax,1701h ;打开剪贴板 int 2fh mov ax,1704h ;读剪贴板数据长度 mov dx,1 ;数据格式为文本 int 2fh or ax,ax ;为 0 则无数据 jnz has_data or dx,dx jz no_data has_data: mov _length,ax ;保存数据长度 mov _length+2,dx
mov ax,1705h ;读剪贴板数据 mov dx,1 mov bx,offset buffer int 2fh or ax,ax jz no_data mov ax,1708h ;关闭剪贴板 int 2fh mov si,_length mov buffer [si],0 mov si,offset d_clip ;显示数据 call printf int 20h no_data: mov si,offset d_no_data call printf int 20h include printf.asm ;一个共用的显示程序 buffer equ this byte ;文件用作数据缓冲区
code ends end start