概述:
Windows 中剪贴板的功能给了我们很大的方便,但在 DOS 窗口下运行的程序如何利用剪贴板来获得数据呢?DOS 的 INT 2FH 中断提供了几个有关剪贴板操作的中断,以下是中断的资料和读取剪贴板文本数据的编程示例。经过修改大家很容易编出读取图形数据的程序。
本程序要用到的 INT 2FH 中断的 17xxH 功能如下:
类似地,我们可以实现Windows API中的EmptyClipboard()、CloseClipboard() 、SetClipboardData()和GetClipboardData()函数。除此以外,我们还发现了一个在SDK手册上没有的GetClipboardDataSize()函数,这个函数返回剪贴板的数据大小,这个数值通常是16的整数倍,它比剪贴板上实际字符串的长度要大,这个函数对你在读剪贴板之前进行内存分配很有帮助。下面这段示例程序包括了这些函数的实现。在调用这些中断之前先要确保Windows已经运行,示例中的IsWindowsRunning()函数就是完成这一工作的。你甚至可以用老掉牙的编译系统Turbo C 2.0来运行它。示例程序先在剪贴板上写入一个字符串,然后从剪贴板读回这个字符串。你可以发现整个示例程序的编程同Windows程序的差别是很小的,这是此种方法的一个优点:你对DOS程序的修改可以减少到最少,而Windows程序则不需要任何修改。可以预见,如果你把DOS部分移植到Windows上来,此处所需的改动也是很少的。
#include <stdlib.h>
#include <dos.h>
#include <string.h>
union REGS r;
struct SREGS sr;
/*
The OpenClipboard function opens the clipboard. Other applications
will not be able to modify the clipboard until the CloseClipboard
function is called.
*/
void OpenClipboard()
{
r.x.ax = 0x1701;
int86(0x2f, &r, &r);
}
/*
The EmptyClipboard function empties the clipboard and frees handles
to data in the clipboard.
*/
void EmptyClipboard()
{
r.x.ax = 0x1702;
int86(0x2f, &r, &r);
}
/*
The CloseClipboard function closes the clipboard.
*/
void CloseClipboard()
{
r.x.ax = 0x1708;
int86(0x2f, &r, &r);
}
/*
The SetClipboardData function sets the data in the clipboard. The
application must have called the OpenClipboard function before
calling the SetClipboardData function.
*/
int SetClipboardData(char* s)
{
int Len;
Len = strlen(s) + 1;
r.x.ax = 0x1703;
r.x.dx = 1;
r.x.si = 0;
r.x.cx = Len;
r.x.bx = FP_OFF(s);
sr.es = FP_SEG(s);
int86x(0x2f, &r, &r, &sr);
return r.x.ax;
}
/*
The GetClipboardDataSize function retrieves the size of the current
clipboard data. This function is undocumented in Windows SDK.
*/
int GetClipboardDataSize()
{
r.x.ax = 0x1704;
r.x.dx = 1;
int86(0x2f, &r, &r);
return r.x.ax;
}
/*
The GetClipboardData function retrieves a handle of the current
clipboard data having string format. The clipboard must have been
opened previously.
*/
int GetClipboardData(char* s)
{
r.x.ax = 0x1705;
r.x.dx = 1;
r.x.bx = FP_OFF(s);
sr.es = FP_SEG(s);
int86x(0x2f, &r, &r, &sr);
return r.x.ax;
}
/*
The IsWindowsRunning function detects whether Windows is running.
The application must have called this function before calling all
Clipboard functions.
*/
int IsWindowsRunning()
{
r.x.ax = 0x1700;
int86(0x2f, &r, &r);
return r.x.ax != 0x1700;
}
void main()
{
char s[256],s2[]="This string is passed by an MS-DOS application.";
if (!IsWindowsRunning()) {
printf("Windows is NOT running!\n");
exit(- 1);
}
OpenClipboard();
SetClipboardData(s2);
printf("Data size=%d, string length=%d\n", GetClipboardDataSize(s2),
strlen(s2));
GetClipboardData(s);
printf("%s\n", s);
CloseClipboard();
getch();
}
我们不需要再编写一个Windows的示例程序,因为你可以在任何一个能够进行文本粘贴的Windows 3.x或Windows 95的程序中,比如NotePad,来检验这一结果。从Windows使用者的角度来看,你甚至感觉不到这个字符串是来自DOS的。如果打开Windows的剪贴板查看程序,你会发现此时剪贴板上的数据格式为“文本”和“OEM文本”两种。
相关阅读 微软Lumia 640多少钱 微软640/640XL价格公布Win10手机预览版怎么样 Win10手机预览版体验视频怎么升级到Win10手机版 Win10手机版升级教程Windows10手机版怎么样 Win10手机版初体验Windows10手机版正式发布 全新的改变电脑版微信来临 Windows版微信体验windows安全警报怎么关闭 为什么总是弹出安全警告Windows Phone市场占有率持续下跌 难敌苹果安卓
热门文章 去除winrar注册框方法
最新文章
去除winrar注册框方法通过Access破解MSSQL获
JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据W32dasm 串式参考按钮变灰色怎么办?
人气排行 华为无线路由器HG522-C破解教程(附超级密码UltraISO注册码全集(最新)JEB格式文件京东电子书下载和阅读限制破解教华为无线猫HG522破解qq相册密码破解方法怎么用手机破解收费游戏校内网相册批量下载工具WareZ组织揭密:他们是盗版的罪魁祸首吗?
查看所有0条评论>>