论文部分内容阅读
摘要:针对DOS程序用户界面差、不易掌握的缺点,提出了应用模拟键盘技术,并结合进程检测技术进行数据传递的方法。该方法不需要对原DOS程序进行任何修改,就能将DOS程序升级成图形操作界面。同时该方法还能对DOS程序的运行过程状态进行监测,为Windows下DOS应用程序的改造和利用提供了一种简便易行的途径。
关键词:DOS程序;升级;GUI;模拟键盘;CPU占用率
0 引言
在DOS时代开发的大量辅助计算类程序,受当时的技术条件所限制,不可能采用图形化界面。这类程序的输入和输出基本都采用字符方式,在程序运行过程中需要用户进行某种交互操作时,一般都是在DOS程序特有的黑屏幕界面上进行,程序的操作性不好。随着技术的发展,开发人员已经可以很容易地开发出界面友好、易于学习和掌握的应用程序,用户也不再愿意接受那些界面呆板的DOS程序。在这种背景下,出现了对DOS程序界面升级的需求。文献[1-4]介绍了以文件作为DOS程序输入的传递接口,实现界面升级。但这种方法需要修改原DOS程序代码,重定向DOS程序从文件中读取输入信息,而不是等待用户从键盘输入,工作量比较大;如果没有源代码,将无法进行升级工作。
本文提出一种新的方法:基于模拟键盘技术和CPU占用率检测的集成升级方法。这种方法的特点是不需要对原DOS程序进行任何修改,对不能在DOS控制台窗口中运行的DOS也适用,解决了文献[2]中所介绍方法的缺陷。
1 处理流程
对运行过程中不需要用户输入数据,以及可以将所需要的输入数据作为命令行参数进行调用的DOS程序,升级为Windows的图形化用户界面都是很简单的事情,这里不进行讨论。本文重点论述的是在运行过程中需要用户交互操作的DOS程序的升级,例如输入所需的数据文件保存路径,选择计算过程中是否要考虑的一些因素等等。这种交互操作可能是一步,也可能是多步。图1给出了一个典型的DOS程序运行界面示例。该程序是用于船体结构计算的一个子程序。从图1看出,这类程序界面的提示信息很不友好,而且不能利用鼠标操作,操作性不好。
图1 一个典型的DOS程序运行界面
本文所采用的方法,其处理流程如图2所示。
首先,应用可视化编程语言编写用户交互操作界面程序。该程序建立起用户、Windows系统和DOS程序的联系。在这个程序上设置启动或调用DOS程序的按钮或菜单;还可以利用文本框、组合框或对话框接受用户输入,利用单选或复选按钮实现DOS命令行参数的输入等。
其次,启动基于图形界面的集成程序界面,并调用DOS程序。
第三,DOS程序运行后,监测该DOS程序的CPU占用率,对其运行状态进行检测。若程序正处于等待用户输入状态,此时利用模拟键盘API函数,给程序发送所需要的输入数据消息,直到程序模块运行结束。当然程序运行所需要的数据,仍然需要用户来决定,只是这类数据操作是利用图形界面来操作的。
最后,程序结束运行,返回图形操作界面,显示计算结果。
图2处理流程图
2 主要技术原理
2.1进程技术
启动一个可执行程序(.exe,.bat)的方法有多种,但主要是利用Windows平台的API函数Winexec,或编程语言提供的其他类似函数,例如Visual Fortran提供的PUNQQ函数,VB提供的Shell函数等。这种方法启动DOS平台下的可执行程序,运行后出现的界面就是大家熟悉的黑屏幕,如图1所示。这种方法称为进程调用技术。因为被启动的程序和基于GUI方式的主程序是在两个不同的进程空间,相互不能直接访问到对方的内存区。在本文的工作中,也利用进程技术来启动要升级到GUI界面的原DOS平台程序。本文利用VB.NET平台,使用该平台所提供的Process类来启动相应的DOS程序。图3是启动一个DOS程序的界面示例。在『启动计算』按钮中设置如下代码:
Dim p As New Process
p.Start("D:W.C2006.exe")'要启动的DOS程序是ZC2006.exe
图3调用DOS程序的示例界面
2.2键盘模拟方法
本文采用键盘模拟的方式来实现主程序和被调用程序(DOS程序)间的数据传递。其原理如下:
Windows API函数keybd_event函数能够模拟一次键盘按击事件,其函数接口声明如下:
Declare Sub keybd_event Lib"user32"Alias"keybd_event"
(ByVal bVk As Byte,ByVal bScan As Byte,ByVal dwFlags
As Long,ByVal dwExtralnfo As Long)
其中参数bVk就是要模拟的虚拟键码,其他参数赋值为0。这里虚拟键码与字符的ASCII码是不对应的,比如字母“a”的ASCII码是十进制的97,但这个字符的虚拟键码是十进制的65。所以要进行必要的转换。该转换可以利用API函数VkKeyScan来实现。接口声明如下:
Public Declare Function VkKeyScan Lib"user32"Alias
"VkKeyScanA"(ByVal cChar As Byte)As Integer
参数cChar代表需要取得虚拟键码的字符的ASCII值。所以,对图3所示界面的文本框中输入的文件名,采用消息的方式发送到DOS程序窗口中去的主要代码如下:
If Me.TxtB_filename.Text<>String.Empty Then
Dim i As Integer
For i=0 TO Me.TxtB_filename.Text.Length-1
keybd_event(VkKeyScan(Asc(Me.TxtB_filename.Text.
Substring(i,1))),0,0,0)
Next i
keybd_event(VK_RETURN,0,0,0)’发送一个回车按键
End If
对于运行时需要用户多步交互操作的DOS程序,可在Windows图形界面程序中,将用户通过界面选择、输入的数据存入一个字符串类型数组M。然后利用定时器的定时消息来检测DOS程序运行状态,处于空闲态时,将字符串数组中当前要发送元素的内容用API函数发送给DOS程序,并记录下一次要发送的消息在数组M中的位置。
2.3进程状态检测技术
被启动的DOS程序,有些在运行过程中需要用户进行多步交互操作。在这种情况下,就存在什么时间给DOS程序发送所需的输入信息的问题。将该DOS程序正常运行所需要的多步输入信息一次全部发送是没有任何意义的。解决这个发送时间的问题有两种处理方法。
方法一:因为以前开发的DOS程序在当前电脑硬件配置条件下,运行时间一般都很短,所以可以设定一个固定的时间间隔来发送,这个时间间隔可以比实际需要的时间大很多,以保证DOS程序已经运行到等待输入的状态。
方法二:利用Windows平台的进程监测技术。如果一个程序正在运行,其对CPU的占用率肯定是大于0的,而处于等待输入的状态时,其对CPU的占用率就等于0。所以可以监测特定程序对CPU的占用率来判断DOS程序的状态。
两种方法比较,方法一的实现很简单,但如果特定程序在某两步输入操作间的运行时间很长,则这种方法不能保证一定合适,而且效率要低一些。所以本文采用第二种方法。 本文利用.NET平台所提供的Process对象,能够检测出某个时间点上,一个进程对CPU的占用率。图4是本文开发的进程检测程序的界面。只有当程序处于等待用户输入的状态时,才能发送所需要的数据给DOS程序。如果提前发送会导致数据的丢失,导致运行错误;而延迟发送又影响程序运行效率,最优化的方法是实时监控DOS程序的运行状态。
图4 进程信息示例程序界面
3 结束语
用可视化编程语言来制作用户交互界面是很容易的,因此利用可视化编程语言来制作DOS程序的数据输入界面和结果输出界面,将DOS程序升级成具有良好操作性的图形化界面,具有很强的应用价值。本文描述的DOS程序升级方法,不需对原DOS程序进行任何修改,花费最小的代价,将程序升级到GUI图形界面,而且对没有程序源代码的DOS程序也完全适用。应用这一技术方案,对原DOS时代开发的船体计算程序进行了升级,证明了该方法简单可行,完全可应用于其他同类型DOS程序的升级,为Windows下DOS应用程序的改造和利用提供了一种简便易行的方法。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:DOS程序;升级;GUI;模拟键盘;CPU占用率
0 引言
在DOS时代开发的大量辅助计算类程序,受当时的技术条件所限制,不可能采用图形化界面。这类程序的输入和输出基本都采用字符方式,在程序运行过程中需要用户进行某种交互操作时,一般都是在DOS程序特有的黑屏幕界面上进行,程序的操作性不好。随着技术的发展,开发人员已经可以很容易地开发出界面友好、易于学习和掌握的应用程序,用户也不再愿意接受那些界面呆板的DOS程序。在这种背景下,出现了对DOS程序界面升级的需求。文献[1-4]介绍了以文件作为DOS程序输入的传递接口,实现界面升级。但这种方法需要修改原DOS程序代码,重定向DOS程序从文件中读取输入信息,而不是等待用户从键盘输入,工作量比较大;如果没有源代码,将无法进行升级工作。
本文提出一种新的方法:基于模拟键盘技术和CPU占用率检测的集成升级方法。这种方法的特点是不需要对原DOS程序进行任何修改,对不能在DOS控制台窗口中运行的DOS也适用,解决了文献[2]中所介绍方法的缺陷。
1 处理流程
对运行过程中不需要用户输入数据,以及可以将所需要的输入数据作为命令行参数进行调用的DOS程序,升级为Windows的图形化用户界面都是很简单的事情,这里不进行讨论。本文重点论述的是在运行过程中需要用户交互操作的DOS程序的升级,例如输入所需的数据文件保存路径,选择计算过程中是否要考虑的一些因素等等。这种交互操作可能是一步,也可能是多步。图1给出了一个典型的DOS程序运行界面示例。该程序是用于船体结构计算的一个子程序。从图1看出,这类程序界面的提示信息很不友好,而且不能利用鼠标操作,操作性不好。
图1 一个典型的DOS程序运行界面
本文所采用的方法,其处理流程如图2所示。
首先,应用可视化编程语言编写用户交互操作界面程序。该程序建立起用户、Windows系统和DOS程序的联系。在这个程序上设置启动或调用DOS程序的按钮或菜单;还可以利用文本框、组合框或对话框接受用户输入,利用单选或复选按钮实现DOS命令行参数的输入等。
其次,启动基于图形界面的集成程序界面,并调用DOS程序。
第三,DOS程序运行后,监测该DOS程序的CPU占用率,对其运行状态进行检测。若程序正处于等待用户输入状态,此时利用模拟键盘API函数,给程序发送所需要的输入数据消息,直到程序模块运行结束。当然程序运行所需要的数据,仍然需要用户来决定,只是这类数据操作是利用图形界面来操作的。
最后,程序结束运行,返回图形操作界面,显示计算结果。
图2处理流程图
2 主要技术原理
2.1进程技术
启动一个可执行程序(.exe,.bat)的方法有多种,但主要是利用Windows平台的API函数Winexec,或编程语言提供的其他类似函数,例如Visual Fortran提供的PUNQQ函数,VB提供的Shell函数等。这种方法启动DOS平台下的可执行程序,运行后出现的界面就是大家熟悉的黑屏幕,如图1所示。这种方法称为进程调用技术。因为被启动的程序和基于GUI方式的主程序是在两个不同的进程空间,相互不能直接访问到对方的内存区。在本文的工作中,也利用进程技术来启动要升级到GUI界面的原DOS平台程序。本文利用VB.NET平台,使用该平台所提供的Process类来启动相应的DOS程序。图3是启动一个DOS程序的界面示例。在『启动计算』按钮中设置如下代码:
Dim p As New Process
p.Start("D:W.C2006.exe")'要启动的DOS程序是ZC2006.exe
图3调用DOS程序的示例界面
2.2键盘模拟方法
本文采用键盘模拟的方式来实现主程序和被调用程序(DOS程序)间的数据传递。其原理如下:
Windows API函数keybd_event函数能够模拟一次键盘按击事件,其函数接口声明如下:
Declare Sub keybd_event Lib"user32"Alias"keybd_event"
(ByVal bVk As Byte,ByVal bScan As Byte,ByVal dwFlags
As Long,ByVal dwExtralnfo As Long)
其中参数bVk就是要模拟的虚拟键码,其他参数赋值为0。这里虚拟键码与字符的ASCII码是不对应的,比如字母“a”的ASCII码是十进制的97,但这个字符的虚拟键码是十进制的65。所以要进行必要的转换。该转换可以利用API函数VkKeyScan来实现。接口声明如下:
Public Declare Function VkKeyScan Lib"user32"Alias
"VkKeyScanA"(ByVal cChar As Byte)As Integer
参数cChar代表需要取得虚拟键码的字符的ASCII值。所以,对图3所示界面的文本框中输入的文件名,采用消息的方式发送到DOS程序窗口中去的主要代码如下:
If Me.TxtB_filename.Text<>String.Empty Then
Dim i As Integer
For i=0 TO Me.TxtB_filename.Text.Length-1
keybd_event(VkKeyScan(Asc(Me.TxtB_filename.Text.
Substring(i,1))),0,0,0)
Next i
keybd_event(VK_RETURN,0,0,0)’发送一个回车按键
End If
对于运行时需要用户多步交互操作的DOS程序,可在Windows图形界面程序中,将用户通过界面选择、输入的数据存入一个字符串类型数组M。然后利用定时器的定时消息来检测DOS程序运行状态,处于空闲态时,将字符串数组中当前要发送元素的内容用API函数发送给DOS程序,并记录下一次要发送的消息在数组M中的位置。
2.3进程状态检测技术
被启动的DOS程序,有些在运行过程中需要用户进行多步交互操作。在这种情况下,就存在什么时间给DOS程序发送所需的输入信息的问题。将该DOS程序正常运行所需要的多步输入信息一次全部发送是没有任何意义的。解决这个发送时间的问题有两种处理方法。
方法一:因为以前开发的DOS程序在当前电脑硬件配置条件下,运行时间一般都很短,所以可以设定一个固定的时间间隔来发送,这个时间间隔可以比实际需要的时间大很多,以保证DOS程序已经运行到等待输入的状态。
方法二:利用Windows平台的进程监测技术。如果一个程序正在运行,其对CPU的占用率肯定是大于0的,而处于等待输入的状态时,其对CPU的占用率就等于0。所以可以监测特定程序对CPU的占用率来判断DOS程序的状态。
两种方法比较,方法一的实现很简单,但如果特定程序在某两步输入操作间的运行时间很长,则这种方法不能保证一定合适,而且效率要低一些。所以本文采用第二种方法。 本文利用.NET平台所提供的Process对象,能够检测出某个时间点上,一个进程对CPU的占用率。图4是本文开发的进程检测程序的界面。只有当程序处于等待用户输入的状态时,才能发送所需要的数据给DOS程序。如果提前发送会导致数据的丢失,导致运行错误;而延迟发送又影响程序运行效率,最优化的方法是实时监控DOS程序的运行状态。
图4 进程信息示例程序界面
3 结束语
用可视化编程语言来制作用户交互界面是很容易的,因此利用可视化编程语言来制作DOS程序的数据输入界面和结果输出界面,将DOS程序升级成具有良好操作性的图形化界面,具有很强的应用价值。本文描述的DOS程序升级方法,不需对原DOS程序进行任何修改,花费最小的代价,将程序升级到GUI图形界面,而且对没有程序源代码的DOS程序也完全适用。应用这一技术方案,对原DOS时代开发的船体计算程序进行了升级,证明了该方法简单可行,完全可应用于其他同类型DOS程序的升级,为Windows下DOS应用程序的改造和利用提供了一种简便易行的方法。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。