我正在做一个程序,需要严格控制打印分数,程序做完了才发现原来任何打印机都可以在属性中修改“打印到以下端口”为file 可实现打印的文件中,我试了setprinter等几个命令想将port强行改为LPT1:,可没有成功,
请大侠指点
另外,有朋友说有那么一个软件,可以截取送到打印口的各类数据,生成图形文件,我的命好苦阿,help!
请大侠指点
另外,有朋友说有那么一个软件,可以截取送到打印口的各类数据,生成图形文件,我的命好苦阿,help!
来自:Pipi., 时间:2000-4-3 23:46:00, ID:211770
有那么一个软件,可以截取送到打印口的各类数据,生成图形文件
PaperPort
PaperPort
来自:an, 时间:2000-4-4 0:16:00, ID:211797
哪里有PaperPort,如何工作?如何阻止这该死的东西?
help!help!!
help!help!!
来自:popeye, 时间:2000-4-5 0:12:00, ID:212622
listen
来自:沈前卫, 时间:2000-4-5 0:20:00, ID:212629
Hubdog Tips中的东西,不知对你有没有帮助。
改变打印机的打印端口
uses Printers;
{$IFNDEF WIN32}
const MAX_PATH = 144;
{$ENDIF}
procedure TForm1.Button1Click(Sender: TObject);
var
pDevice : pChar;
pDriver : pChar;
pPort : pChar;
hDMode : THandle;
PDMode : PDEVMODE;
begin
if PrintDialog1.Execute then begin
GetMem(pDevice, cchDeviceName);
GetMem(pDriver, MAX_PATH);
GetMem(pPort, MAX_PATH);
Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);
FreeMem(pDevice, cchDeviceName);
FreeMem(pDriver, MAX_PATH);
FreeMem(pPort, MAX_PATH);
Printer.BeginDoc;
Printer.Canvas.TextOut(100, 100, 'Delphi Is RAD!');
Printer.EndDoc;
end;
end;
改变打印机的打印端口
uses Printers;
{$IFNDEF WIN32}
const MAX_PATH = 144;
{$ENDIF}
procedure TForm1.Button1Click(Sender: TObject);
var
pDevice : pChar;
pDriver : pChar;
pPort : pChar;
hDMode : THandle;
PDMode : PDEVMODE;
begin
if PrintDialog1.Execute then begin
GetMem(pDevice, cchDeviceName);
GetMem(pDriver, MAX_PATH);
GetMem(pPort, MAX_PATH);
Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);
FreeMem(pDevice, cchDeviceName);
FreeMem(pDriver, MAX_PATH);
FreeMem(pPort, MAX_PATH);
Printer.BeginDoc;
Printer.Canvas.TextOut(100, 100, 'Delphi Is RAD!');
Printer.EndDoc;
end;
end;
来自:Pipi., 时间:2000-4-6 0:44:00, ID:213470
我来简化一下:
GetMem(pDevice, cchDeviceName);
GetMem(pDriver, MAX_PATH);
GetMem(pPort, MAX_PATH);
Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);
FreeMem(pDevice, cchDeviceName);
FreeMem(pDriver, MAX_PATH);
FreeMem(pPort, MAX_PATH);
太繁。 这样就可以了:
var s1,s2,s3:array[0..MAX_PATH] of char;
Printer.GetPrinter(s1, s2, s3, hDMode);
Printer.SetPrinter(s1, s2, 'FILE:', hDMode);
GetMem(pDevice, cchDeviceName);
GetMem(pDriver, MAX_PATH);
GetMem(pPort, MAX_PATH);
Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);
FreeMem(pDevice, cchDeviceName);
FreeMem(pDriver, MAX_PATH);
FreeMem(pPort, MAX_PATH);
太繁。 这样就可以了:
var s1,s2,s3:array[0..MAX_PATH] of char;
Printer.GetPrinter(s1, s2, s3, hDMode);
Printer.SetPrinter(s1, s2, 'FILE:', hDMode);
来自:an, 时间:2000-4-7 17:27:00, ID:215068
各位大虾:
我的问题是将port=FILE:改为port=LPT1:,运行后跟踪参数port确实改为LPT1
可是以后的打印还是打印到了file上,其实打开控制面板看打印机的属性,port还是file:不止为何故?
我的问题是将port=FILE:改为port=LPT1:,运行后跟踪参数port确实改为LPT1
可是以后的打印还是打印到了file上,其实打开控制面板看打印机的属性,port还是file:不止为何故?
来自:soul, 时间:2000-4-7 18:06:00, ID:215091
先显示打印设置,再直接打印到临时文件,不显示打印对话框,再把文件送到LPT1
来自:Pipi., 时间:2000-4-8 13:51:00, ID:215649
setprinter仅可以设置文件型的输出。
下面的过程检测当前打印机输出端口,仅可以检测系统设置的端口,
在nt中,如果运行中在“控制面板/打印机”改变打印机的输出端口
也能检测到,但是在95下面行不行就不知道。
另外,如果用你自己的程序里面用 Printer.SetPrinter 设置的端口,
下面的过程也是不能检测到的。
判断严格一点,有一点不符合就退出。(比如可以指定 LPT1 ,其他端口
都禁止)
var
h:THandle;
info:Pointer;
n:DWORD;
s1,s2,s3:array[0..1024]of char;
hmem:DWORD;
begin
printer.GetPrinter(s1,s2,s3,hmem);
//这里判断一下s3(大小写无关)
if not OpenPrinter(s1,h,nil) then
RaiseLastWin32Error();
GetPrinter(h,2,@info,0,@n);
if( GetLastError()=122 )then
GetMem(info,n)
else
RaiseLastWin32Error();
if(not GetPrinter(h,2,info,n,@n))then
RaiseLastWin32Error();
ShowMessage(PRINTER_INFO_2(info^).pPortName);
//这里判断一下PRINTER_INFO_2(info^).pPortName
end;
还有一个问题,
nt的 打印机属性/调度 有个选择:“打印完后保留文档”
如果选中该项,(即使是输出到LPT1),文档在打印完后
并不会被删除,还留在那里,可以不通过程序再打几次,
你怎么解决? 95/98不知道是否有这个功能,以后总会升级
到win2000的,win2000肯定有这个功能啦.
你怎么办?
还有啊,要是 LPT1 是虚拟的端口,数据被那个虚拟端口程序截取了,
你怎么办?
下面的过程检测当前打印机输出端口,仅可以检测系统设置的端口,
在nt中,如果运行中在“控制面板/打印机”改变打印机的输出端口
也能检测到,但是在95下面行不行就不知道。
另外,如果用你自己的程序里面用 Printer.SetPrinter 设置的端口,
下面的过程也是不能检测到的。
判断严格一点,有一点不符合就退出。(比如可以指定 LPT1 ,其他端口
都禁止)
var
h:THandle;
info:Pointer;
n:DWORD;
s1,s2,s3:array[0..1024]of char;
hmem:DWORD;
begin
printer.GetPrinter(s1,s2,s3,hmem);
//这里判断一下s3(大小写无关)
if not OpenPrinter(s1,h,nil) then
RaiseLastWin32Error();
GetPrinter(h,2,@info,0,@n);
if( GetLastError()=122 )then
GetMem(info,n)
else
RaiseLastWin32Error();
if(not GetPrinter(h,2,info,n,@n))then
RaiseLastWin32Error();
ShowMessage(PRINTER_INFO_2(info^).pPortName);
//这里判断一下PRINTER_INFO_2(info^).pPortName
end;
还有一个问题,
nt的 打印机属性/调度 有个选择:“打印完后保留文档”
如果选中该项,(即使是输出到LPT1),文档在打印完后
并不会被删除,还留在那里,可以不通过程序再打几次,
你怎么解决? 95/98不知道是否有这个功能,以后总会升级
到win2000的,win2000肯定有这个功能啦.
你怎么办?
还有啊,要是 LPT1 是虚拟的端口,数据被那个虚拟端口程序截取了,
你怎么办?
来自:Jams, 时间:2000-7-8 22:18:00, ID:278861
>>
来自:Shenxinaz, 时间:2000-7-23 1:29:00, ID:290911
硬拷贝可以被复印,你最好再每次打印时注明: 这时第n次打印!

浙公网安备 33010602011771号