Section courante

A propos

Section administrative du site

Introduction

Le presse-papier est un outil permettant l'échange d'information diverses entre une ou plusieurs applications sans passer par l'intermédiaire d'un fichier. Le principe est déjà assez ancien et c'est la raison pour laquelle Windows 9X par exemple fournit des routines aux applications DOS permettant d'accomplir se genre d'opération.

Windows 9X

Les routines de Windows 9X ne sont très utilisé par les applications DOS récentes, entre-autre, le MonsterBook des Gladir.com offre se genre de possibilité automatiquement. Les bibliothèques SWAG en propose également de nombreuses exemples. Voici donc un code source Pascal et assembleur permettant d'atteindre cette objectif:

Const
 {Format du Presse-Papier Windows}
  cfText=1; { Texte }
  cfBitmap=2; { Bitmap OEM }
  cfOemText=7; { Texte OEM }
  cfDspText=$81; { Format texte }
  cfDspBitmap=$82; { Format dessin }


{ Description
  ------------
  Cette fonction indique si les outils du presse-papier sont disponibles pour l'application DOS.
}


Function ClipboardFunctionsAvailable:Boolean;Assembler;ASM
 MOV AX,1700h
 INT 2Fh
 XOR BL,BL
 CMP AX,1700h
 JE @1
 MOV BL,1
@1:
 XCHG
AX,BX
END;


Function ClipboardCompact(lDesired:LongInt):LongInt;Assembler;ASM
 MOV AX,1709h
 LES CX,lDesired
 MOV SI,ES
 INT 2Fh

END;


{ Description
  ------------
  Cette fonction permet d'effectuer la fermeture (terminaison du processus de lecture) du presse-papier précédemment préparer par «OpenClipboard».
}


Function CloseClipboard:Boolean;Assembler;ASM
 MOV AX,1708h
 INT 2Fh
 OR AX,AX
 JE @End
 MOV AL,1
@End:

END;


{ Description
  ------------
  Cette fonction permet de savoir si le presse-papier est actuellement vide et sans aucun contenu.
}


Function EmptyClipboard:Boolean;Assembler;ASM
 MOV AX,1702h
 INT 2Fh
 OR AX,AX
 JE @End
 MOV AL,1
@End:

END;


{ Description
  ------------
   Cette fonction retourne la taille du presse-papier en fonction du format spécifier (cf????).
}


Function GetClipboardDataSize(wFormat:Word):LongInt;Assembler;ASM
 MOV AX,1704h
 MOV DX,wFormat
 INT
2Fh
END;


{ Description
------------
Cette fonction renvoie les informations contenu dans le presse-papier et indique si l'opération c'est bien déroulée.
}


Function GetClipboardData(wFormat:Word;DataPtr:Pointer):Boolean;Assembler;ASM
 MOV AX,1705h
 MOV DX,wFormat
 LES BX,DataPtr
 INT 2Fh
 OR AX,AX
 JE @End
 MOV AL,1
@End:

END;


{ Description
------------
Cette fonction permet d'effectuer l'ouverture du presse-papier afin d'éventuellement lire le contenu de celui-ci.
}


Function OpenClipboard:Boolean;Assembler;ASM
 MOV AX,1701h
 INT 2Fh
 OR AX,AX
 JE @End
 MOV AL,1
@End:

END;


{ Description
  ------------
   Cette fonction permet de fixer le contenu du presse-papier avec le format spécifié.
}


Function SetClipboardData(wFormat:Word;DataPtr:Pointer;lSize:LongInt):Boolean;Begin
 SetClipboardData:=False;
 If(DataPtr<>Nil)and(lSize<>0)and(ClipboardCompact(lSize)>=lSize)Then Begin
  ASM
   MOV AX,1703h
   MOV DX,wFormat
   LES CX,lSize
   MOV SI,ES
   LES BX,DataPtr
   INT 2Fh
   OR AX,AX
   JE @End
   MOV AL,1
@End:
   MOV @Result
,AL
  END;
 End;
End;

Pour coller un bloc de données de Windows 9X dans un programme DOS on aura donc la structure suivante:

If(ClipboardFunctionsAvailable)Then Begin
 If(OpenClipboard)Then Begin
  Len:=GetClipboardDataSize(cfOemText);
  If Len=0Then WriteLn('Presse-papier vide!')Else
  If Len<=65520Then Begin
   Data:=MemAlloc(Len);
   GetClipboardData(cfOemText,Data
);
    { Données contenu dans Data...}
   CloseClipboard;
  End;
 End
;
End;


Dernière mise à jour : Dimanche, le 1 mai 2016