![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-14 23:49 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » TC编译的EXE文件,获取当前屏幕显示信息失败 |
| 可打印版本 2,388 / 6 |
| 第1楼 pigglu | 发表于 2010-04-10 18:44 |
| 新手上路 发帖 5 积分 12 | |
|
TC编译的EXE文件,获取当前屏幕显示信息失败 用TC编译生成一个EXE文件(子程序),用于其它程序(主程序)调用,EXE子程序运行时需要先保存主程序原有界面,调用完成后进行界面恢复。
目前实现了: 1、单独一个程序显示图片,将屏幕保存到文件,再通过读文件恢复屏幕; 2、主程序显示图片,主程序将屏幕保存到文件,主程序调用EXE子程序,子程序读文件将屏幕恢复; 需要实现的真正功能:主程序显示图片,主程序调用EXE子程序,子程序将主程序界面保存到文件,调用结束时从文件恢复屏幕显示。 尝试了多次,子程序一运行就进行屏幕保存,但都没有办法成功保存主程序界面。 非常着急,还请高手指教,谢谢。 |
|
| 第2楼 070 | 发表于 2010-04-10 21:18 |
| 高级用户 发帖 218 积分 663 来自 福建 | |
|
目前你的程序保存的屏幕信息是什么样子的,是全屏幕没有内容吗,
有可能主程序在调用外界exe的时候,先切换到 dos,然后再运行exe 个人猜测,估计是错的:) |
|
| 第3楼 pigglu | 发表于 2010-04-11 03:55 |
| 新手上路 发帖 5 积分 12 | |
Originally posted by 070 at 2010-4-10 09:18 PM: 子程序(S_new.exe)代码如下: BYTE far *p; #define MAXX 640 #define MAXY 480 int Get256Blk(int sx,int sy,int ex,int ey, const char *filename); int Set256Blk(int sx,int sy,int ex,int ey, const char *filename); void InitGraph(); void CloseGraph(); void Exit(char *ErrorCode); int main( int argc, char *argv) { int row, line; Get256Blk(0, 0, MAXX-1, MAXY-1, "DISP"); row =3; line = 2; clrscr(); gotoxy(row, line++); cprintf("Begin...\n"); getch(); InitGraph(); Set256Blk(0, 0, MAXX-1, MAXY-1, "DISP"); getch(); return 0; } /*************************************************************** 函数名称:Get256Blk(int sx,int sy,int ex,int ey,const char *filename) 函数功能:保存指定矩形区域的屏幕显示信息到文件 ***************************************************************/ int Get256Blk(int sx,int sy,int ex,int ey, const char *filename) { int j, i; FILE *fp; p=(BYTE far*)0xa0000000L; fp = fopen(filename, "w+"); for(j=sy;j<=ey;j++) { for(i=0;i<ex-sx;i++) { fputc(*(p+(j*(ey-sy)+i)), fp); } } fclose(fp); return 0; } /*************************************************************** 函数名称:Set256Blk(int sx,int sy,int ex,int ey,const char *filename) 函数功能:从文件恢复指定矩形区域的屏幕显示信息 ***************************************************************/ int Set256Blk(int sx,int sy,int ex,int ey, const char *filename) { int i, j; FILE *fp; p=(BYTE far*)0xa0000000L; fp = fopen(filename, "rb+"); if (fp == NULL) { Exit("Can Not Open The File.\n"); return 1; } for(j=sy;j<=ey;j++) { for(i=0;i<ex-sx;i++) { *(p+(j*(ey-sy)+i))=fgetc(fp); } } fclose(fp); return 0; } void InitGraph() { int mod; int dr; detectgraph(&mod, &dr); initgraph(&mod,&dr,""); } void CloseGraph() { closegraph(); } void Exit(char *ErrorCode) { printf("%s",ErrorCode); getch(); exit(0); } 主程序代码如下: void main() { InitGraph(); /* 在屏幕上显示BMP图片*/ ...... getch(); /* 非调用方式,主程序独立实现存屏幕及恢复 */ /* Get256Blk(0, 0, MAXX-1, MAXY-1, "DISP"); getch(); clrscr(); Set256Blk(0, 0, MAXX-1, MAXY-1, "DISP"); getch(); */ /* 调用方式,主程序调用子程序实现存屏幕及恢复 */ system("S_new.exe"); CloseGraph(); } 主程序同样生成一个EXE文件,可直接运行。 “有可能主程序在调用外界exe的时候,先切换到 dos,然后再运行exe”,这个有点不太明白,是不是就是这的原因,应该怎么解决,先谢谢前辈们了~~ |
|
| 第4楼 pigglu | 发表于 2010-04-11 03:58 |
| 新手上路 发帖 5 积分 12 | |
|
补充下,现在保存下的屏幕信息里面全是0xff。
|
|
| 第5楼 070 | 发表于 2010-04-11 08:38 |
| 高级用户 发帖 218 积分 663 来自 福建 | |
|
我的意思是,切换到另一个程序的过程中,把显示模式也给切换了,由图形模式变成了文本模式,然后再接着运行那个子程序。。各人估计,我对dos下程序执行外部程序的流程也不大了解。
你那个备选的过程是不是可以正常运行,也就是不调用外界子程序而自己保存图像的? |
|
| 第6楼 pigglu | 发表于 2010-04-11 10:09 |
| 新手上路 发帖 5 积分 12 | |
就是外调程序失败Originally posted by 070 at 2010-4-11 08:38 AM: 不外调程序,模拟的主程序是可以自己保存屏幕的,虽然保持的图像有点变形,但也还是有保持下东西的,如果使用子程序,保存下的就是全oxff。 在主程序进行子程序调用的时候没有操作显示模式,同样子程序运行的时候也没有操作,调用使用的是system函数,难道和这个函数有关系?? 好郁闷啊:( |
|
| 第7楼 070 | 发表于 2010-04-11 10:50 |
| 高级用户 发帖 218 积分 663 来自 福建 | |
|
恩,可能是跟system函数有关。。
这个函数过程到底是怎么个机理,我也不知道。 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |