一个计算机爱好者的不完整回忆(四十二)用API Hook解决一个大问题

  管装科是我们的兄弟科室,他们有一个软件叫PCPS,是好多年前请一个公司开发的,可以把我们放样的管子出成小票(每段管子的图纸,很简单),这样工人就可以很方便的进行加工了。
  当时我开始做我到目前为止最大的也是最满意的一个软件(后面会写,这个软件的故事很多),用到.net3.5,我们其它科室用的都是winxp,所以没问题。但是军管科就有问题了,他们科全部是win2000,并且只打补丁到sp3,所以我这个软件他们用不了。
  之所以必须用win2000,就是因为这个PCPS。这个PCPS是windows98那个时代开发的,应该是VB6开发的,当系统版本高于win2000 sp4后,输出的文字和图形就会有很大偏差,会错位。由于我做ArcanBook的时候就发现了win98和win2000对文本输出不同,所以对他们科出现这个问题并不吃惊,但这个问题却不太好解决。工厂曾经向开发单位求助,设计单位说我们现在有新版本,你们再买一份吧,因为这个软件版本太老了,我们当年开发这个软件的人都不在了,没办法给你们解决。当时领导曾希望我看看如何解决,实在不行照着这个PCPS做一个软件。我断然予以否决,不是我不喜欢挑战,只是做这个软件的工作量太大了,需要研究很多东西,因为这个PCPS实际上是从一个三维建模的软件中提取数据的,我还得自己去研究接口——关键是我们工厂是没有这方面资料的。另外就是,即便我做了这个软件,也是没有任何回报的。当然,有人会说,你做的那么多软件也都没有回报啊,是的,但是我做的其它软件所涉及到的技术总还可以应用到其它软件中,但是这个PCPS,就只能用这一个地方,以后都不可能再用到这些技术,做这个软件花费的精力绝不亚于重新学习一门语言,基本上属于屠龙之技。
  后来我让他们科出了好多张图,既有正常版本的,也有在winxp下面的。然后我就对比这些图纸,首先就发现所有的线条其实位置都是正确的,只有文字位置差距比较多,并且偏差貌似并不一样,无法通过简单的偏移来纠正。当时不知怎么就灵光一现,也许我拦截住打印的信息看看可以发现规律,貌似API HOOK可以做到,以前没用过API钩子,但是知道这么一件事。在上个世纪我记得在电脑报上有人就发过关于金山词霸屏幕取词的原理,当时看完这篇文章,也没往心里去,因为我也不打算做取词的程序,但是就此知道了有这么一回事——可见平时广泛的阅读很重要,虽然未必了解到真正的知识,但至少知道用的时候去哪里找,说不定什么时候就用上了。于是,查找这方面的资料,很快,知道了怎么拦截。接着就开始捞取数据,打印了很多次,收集了很多数据,然后开始分析这些数据,也许我挺聪明,也许我运气好,反正居然文字位置变化的规律被我找到了,这远比什么API钩子要难弄的多。最后又不断地修正各种参数,基本上完全模拟出了文字偏移的规律。
  事情到此就容易了,剩下的就是去查点资料写代码,经过一番调试,好用了。基本上原理就是运行我这个软件后,我这个软件会拦截所有的TEXTOUT类API函数,大约十多个吧,然后判断是否是PCPS这个软件输出的,如果不是,则原样输出,如果是,则根据截获到的数据进行计算,算出它应该在的位置,然后输出。于是,大功告成。我这个软件不但修正了文字位置,我还更改了字体,因为我们工程上图纸要求都是仿宋,并且宽高比为0.7,而当年这个软件用的就是宋体,而且宽高比是1,其实是不符合我们工程制图要求的。
  这个软件做出来了,在管装科测试效果也不错,但是并没有真正推行,只有我几个关系不错的同事让管理员更换了他们的系统用了我这个软件。我不喜欢去强推我的软件,我只是把这个PCPS挂到我的办公平台上,谁爱用谁用。
  这个软件也是我个人略显得意的一个,当然,现在解决了这个问题后再看其实并不复杂,但是在刚开始的时候,真没想到居然能用这样的办法解决这个问题,虽然很偏门,但是效果很好,效果好到我自己都不太相信,比原来的软件出图效果还棒。后来我又增加了一个功能,自动帮他们填写页数——原来这个软件不能填写页数,只能打印出来后用手写页数,我这个软件发现他们开始打印后,就自动帮他们记页数,然后直接把页数输出到打印机,又是大大方便了他们的工作。
  解决问题的方式不只有一个,能解决就好。也许对大神们这不算什么,但是我一个爱好者,不喜欢研究底层的爱好者来说,用偏门的办法解决得如此完美,我觉得还是可以得意一下的。

你可能感兴趣的:(工作,windows,api,vb,图形,hook)