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
		




(C) Copyright by LuoYunBin's Win32 ASM Page,http://asm.yeah.net