ITEEDU

第1章 Iczelion的Win32汇编教程

第2章 Iczelion的ODBC教程

第3章 Iczelion的VxD教程

第4章 Iczelion的PE教程

第5章 罗云彬的Win32汇编教程

第6章 Win32ASM经验点滴

第7章 X86汇编语言编程

第8章 加密解密

第9章 病毒的分析和防治

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