原 作 者:吴军丽 李继名
原 出 处:计算机世界

在所有的应用软件当中,几乎都会提供打印结果的功能,但大部分的软件并不提供输出结果到文本文件功能(如速达,用友和金碟应用软件等能够打印,但不能将结果直接输出到文本文件;再比如一些与硬件配套的应用软件类似
PeakNet等软件,也只能打印,不能输出到文本文件)。有时候客户需要对这些结果进行再次处理分析和统计。传统的方法,只能把打印到纸上的数据手工输入电脑,再利用自己的统计分析软件来处理这些数据。如果这些数据量大,仅靠人工输入是不可能的。笔者经过探讨和测试,找到了一个方法,实现了他们的无缝连接。为方便起见,以下称本文最早提到提供打印结果功能的软件为软件A,对这些结果再次进行处理分析和统计的软件为软件B。

问题(一)描述:

由于软件A不提供打印文本数据到文本文件中,但可以通过打印机打印出来。比如有些监控机器的软件一直要监控并且不时产生数据,而这些数据又需要重新处理和统计。我们需要的是文本文件。如何解决这个问题,请详见解决思路1),2),3)。

解决思路:

1) 虽然有些软件(比如Excel, Word等)在打印功能中提供“打印到文件”,但实际上打印出来的文件并不是我们所想要的纯数据的文本文件,而是有一堆的打印控制信息在里面。所以我们必须创建一个文本文件打印机,然后选该文本文件打印机为软件A默认的打印机。这样我们才能得到纯数据的文本文件。

2) 创建一个文本文件打印机:在Windows中创建一个新的本地打印机,选“FILE(打印到文件)”端口(注意不是打印机端口也不是串行口);然后需要选一个打印驱动程序(当然,你是牛人的话,自己可以写一个打印驱动程序,但写打印驱动程序对大多数程序员来说是一件很困难的事情)。

3) 尽管Windows提供了数十个厂家的打印驱动程序,但唯独只有Generic提供了文本文件打印程序,所以只能选Generic的 “Generic/Text only” 作为该文本文件打印机的驱动程序。建好了文本文件打印机后,再将软件A默认的打印机重新指向到该文本打印机。这样我们再打印后就可以得到文本文件了。

问题(二)描述

我们的确可以得到文本文件,但新的问题又来了。当软件A用默认的文本文件打印机打印数据到文件时,会弹出一个输入文件名的对话框,此时如果没有操作员使用计算机,软件A会停留住。不为了不要人工输入文件名,请详见解决思路4),5)。

解决思路:

4) 每次打印到文本文件时候,系统会弹出一个对话框,需要输入文件名。对某些一天24小时不停运作的软件来说,靠人工输入文件名是不可能的。

5) 因此,我们可以设计一个程序,或者在软件B中增加一个功能,它的任务就是先找到该对话框,然后自动模拟键盘输入文件名到这个弹出的对话框,并且模拟鼠标点击“确定”按扭来关闭这个对话框,这样无须人工操作就能生成文本文件。

笔者设计的这个软件就是为了解决问题(二)。该软件不光是针对打印弹出的对话框,也可以针对其他一切类似需要人工输入的对话框。该程序代码还有助于解决如何自动关闭弹出的消息框的问题。软件B的数据来源可以是指定文件名的文本文件即我们刚刚得到的文本文件。它应该会定时地去读取这个文本文件,然后进行分析处理和统计。

笔者主要是采用了Windows API 函数,下面先对几个API函数简单的介绍一下:

FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName ):

查找指定类名和窗口名的窗口,返回一个窗口句柄。GetWindowText( HWND hWndLPTSTR lpString, int nMaxCount ):

获得窗口的文本,如果该窗口是对话框,则lpString返回它的标题。

FindWindowEx( HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpszClass,

LPCTSTR lpszWindow ):

在指定的父窗口内查找第一个指定类名的子窗口,返回一个窗口句柄。

SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ):

发一个消息给指定窗口,直到消息被处理完才返回。

SendNotifyMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam):

发一个消息给指定窗口。

有了设计思想后,再来选定一种程序语言。由于大部分语言都支持Windows API函数,所以选什么语言并不太重要,比如DELPHI,VC++,C++BUILDER,VB等都可以,笔者采用的是VC++6.0。

HWND a_window,b_window,f_window;

CFileException e;

char* pFileName ;

char pbuf[100];

memset(pbuf,0,100);

LPTSTR lpString;

CString filename=theApp.GetProfileString("Parameter","FileName","result.txt");//从配置文件中读取要填入对话框的文件名,也就是打印到文件的文件名

CString title=theApp.GetProfileString("Parameter","DialogName","打印到文件");//从配置文件中读取要输入文件名的对话框的标题,如果是英文软件就应该是”Print to file”

f_window=::FindWindow((LPCSTR)(DWORD)WC_DIALOG,title);//找到要输入文件名的对话框的窗口,获得它的句柄。

memset(pbuf,0,100);

::GetWindowText(f_window,pbuf,15);

lpString=title.GetBuffer(15);

if(*lpString==*pbuf)

{

pFileName=filename.GetBuffer(20);

CFile::Remove( pFileName );//如果已经有同名文件存在,则先删除。

filename.ReleaseBuffer();

//注意: CEdit和CButton 都是CWnd 的子类,所以都是窗口,也可以用::FindWindowEx查找得到。

a_window=::FindWindowEx(f_window,NULL,"Edit",NULL);//找到要输入文件名的编辑框。

lpString=filename.GetBuffer(15);

::SendMessage(a_window, WM_SETTEXT,NULL,(LPARAM)lpString);//模拟键盘输入文件名

b_window=::FindWindowEx(f_window,NULL,"Button",NULL);// 找到”确定”按扭

::SendNotifyMessage(b_window, WM_LBUTTONDOWN,MK_LBUTTON,NULL);//给”确定”按扭发送一个按下鼠标左键的消息

::SendNotifyMessage(b_window, WM_LBUTTONUP, NULL,NULL);// 再给”确定”按扭发送一个弹起鼠标左键的消息,第三个参数一定要是NULL,否则不成功。

}

title.ReleaseBuffer();

本程序在VC++6.0下编译,并在Window98,window2000,window XP运行通过。

这个解决方案同时也可以应用到其他自动点击按钮的领域

如何自动截获输出到打印机的文本数据(转载)相关推荐

  1. [转]基于 aspnet 的自动合并输出js和css的解决方案

    这是一个基于 aspnet 的自动合并输出js和css的解决方案. 首先感谢 LoveCherry 的文章<httpmodule和httphandler配合的又一应用--合并脚本样式>(h ...

  2. dos批处理脚本自动添加网络IP打印机-简单亲测可用

    dos批处理脚本自动添加网络IP打印机-简单亲测可用 前言: 网上找的批处理添加方法复杂且需要导入注册表. 花了一天时间研究出来的简单.快速的批处理命令. win10亲测可用. 核心代码: 1. 添加 ...

  3. HIVE优化系列(1)-- 自动合并输出的小文件

    小文件的缺陷我们就不说了,直接进入到正题. HIVE自动合并输出的小文件的主要优化手段为: set hive.merge.mapfiles = true:在只有map的作业结束时合并小文件, set ...

  4. 有关HP LaserJet M132 打印机 打印文本 整体偏右 解决办法

    有关HP LaserJet M132 打印机 打印文本 整体偏右 解决办法 问题 解决(初始化) 关机状态下,按住向右方向键和取消键不放手再开机,开机显示HP时两个按键还是按住不要放手等待屏幕显示出现 ...

  5. Unity调用打印机打印文本或者图片

    Unity调用打印机打印文本或者图片 通过windows命令行使用记事本打印文本 private void PrintTxt(){//picPath=Application.streamingAsse ...

  6. 自动接单小票打印机是怎么实现的?

    总体分析 自动接单小票打印机由硬件设备和服务端构成: 硬件设备负责跟服务器联网并打印出服务器下发的订单,播放对应的语音提示 服务端负责处理打印机海量的并发连接(设备数量足够多的情况),通过接口和美团外 ...

  7. python数据字典ppt_Python3自动生成MySQL数据字典的markdown文本的实现

    为啥要写这个脚本 五一前的准备下班的时候,看到同事为了做数据库的某个表的数据字典,在做一个复杂的人工操作,就是一个字段一个字段的纯手撸,那速度可想而知是多么的折磨和锻炼人的意志和耐心,反正就是很耗时又 ...

  8. 玩转PDF虚拟打印机添加文本功能

    pdfFactory Pro是一款非常容易上手的虚拟打印机,利用这款虚拟打印机,可以完成很多特殊的任务,如文件加密.添加文本.快照等等. 相信很多小伙伴们在打印的时候突然想起来某些地方需要" ...

  9. 【STM32学习】——USART串口数据包HEX/文本数据包收发流程串口收发HEX/文本数据包实操

    文章目录 前言 一.数据包格式(江科大规定) 1.HEX数据包 2.文本数据包 3.两者对比 二.数据包收发流程 1.HEX数据包接收(只演示固定包长) 2.文本数据包接收(只演示可变包长) 三.实操 ...

最新文章

  1. 运维笔试Shell编程题
  2. gcc/g++ 以及makefile
  3. LibSVM学习(三)——LibSVM使用规范
  4. 信息收集——Web目录扫描
  5. 例说C#深拷贝与浅拷贝
  6. python函数格式化_Python通过format函数格式化显示值
  7. eBPF:bpftrace pidnss.bt 的CentOS kernel-3.10版本
  8. 语文到底要不要补课?
  9. 运营商宣传的volte语音高清有啥好处啊?
  10. 签名别人的公钥以及验证签名的公钥
  11. Transformations on DStreams之transform的使用 实现黑名单操作/指定过滤
  12. 男朋友就是要这个样子的
  13. BloomFilter, Count-Min Sketch算法
  14. java -jar xxx.jar
  15. 组合模式-系统菜单的设计
  16. 【中级—,android开发入门pdf
  17. 复现ICCV 2017经典论文—PyraNet
  18. 【python for finance】 Portfolio Optimization 投资组合优化
  19. 计算机网络学习--协议族、协议栈
  20. 计算机类sci中接受综述么,SCI期刊接受的5大类型文章

热门文章

  1. css小三角气泡效果,纯CSS实现聊天框小尖角、气泡效果
  2. 飞信问答(黄金两小时)
  3. r语言聚类分析:k-means和层次聚类
  4. 关于watch跟computed的基础用法
  5. 重聚--SDUTACM十周年庆典专场赛 (部分题解)
  6. 如何在pycharm中使用anaconda
  7. Java 值传递与“引用传递”
  8. Andorid Toast倒计时,自定义显示时间
  9. [附源码]JAVA+ssm纳雍县梦金园珠宝店管理系统(程序+Lw)
  10. 将MAC OS的综合安装文件转换成可引导在ISO或VMDK