C 印表機監控程式

2021-06-20 14:11:00 字數 3401 閱讀 9504



一、需求

由於公司列印紙張浪費比較嚴重,領導要求對所有的列印進行記錄。對比了幾款商業軟體有的功能比較強大但是**比較貴而且好多功能並不需要,而有的功能又過於簡單。我需要的只是對列印進行記錄並不需要計費等功能,而且考慮最好可以和公司現有的oa系統整合在一起,讓領導在oa的介面中就可以查詢到列印記錄,最後決定嘗試自己動手進行開發。

二、查詢資料

由於平時用c#比較多一些所以首先查詢了一些用c#寫的開源程式,但是由於版本都比較老了根本無法執行。又找到乙個c++寫的可以執行但是c++實在是搞不定,也不是一兩天能學會的所以放棄。雖然找了兩天沒有找到可以執行的完整的程式,但是確定了乙個方向,就是呼叫windows api函式enumjobs來獲得列印記錄。並且還搜到了乙份現成的用c#呼叫enumjobs的**,雖然不完整但是確實可以用。

三、規劃

1、首先程式需要安裝到列印伺服器所以最好是以服務的方式執行

2、需要通過配置檔案來確定需要監控的印表機

四、開始動手

1、新建乙個服務

(1)首先開啟visual studio 2008,新建乙個windows service

(2)在service1上點右鍵選add installer

(3)在projectinstaller中設定好服務的執行賬號和相關設定

serviceprocessinstaller1 設定屬性account為localsystem

serviceinstaller1 設定屬性starttype為automatic

(4)新增乙個timer

注意這裡不能新增工具欄那個,要新增system.timer命名空間下的

(5)設定服務執行時啟動timer

protected

override

void onstart(string args) 

(6)定時呼叫監控程式

private

void timer1_elapsed(object sender, system.timers.elapsedeventargs e) 

(7)讀取配置檔案

private

static

string readxml(string nodename, string attr) 

public

static

string getprintername() 

public

static

string getoutputpath() 

配置檔案

xmlversion="1.0"

encoding="utf-8"

?>

<

config

>

<

output

path="c:\\monitor.log"

>

output

>

<

printer

name="hp5100"

>

printer

>

config

>

(8)新建乙個類,核心的監控**,主要就是通過呼叫peekprinterjobs這個函式返回列印的記錄

public

static

int oldprintid = 0; 

[structlayout(layoutkind.sequential)] 

public

struct systemtime 

[structlayout(layoutkind.sequential, charset = charset.auto)] 

public

struct job_info_1 

[dllimport("winspool.drv", charset = charset.auto)] 

public

static

extern

bool openprinter(string pprintername, out intptr phprinter, intptr pdefault); 

[dllimport("winspool.drv", charset = charset.auto)] 

public

static

extern

bool closeprinter(intptr hprinter); 

[dllimport("winspool.drv", charset = charset.auto)] 

public

static

extern

int enumjobs(intptr hprinter, int firstjob, int nojobs, int level, intptr pinfo, int cdbuf, 

outint pcbneeded, out

int pcreturned); 

public

static

void peekprinterjobs(string printertopeek) 

else } 

marshal.freehglobal(pdata); 

closeprinter(handle); 

} private

static

void recordjobtolog(job_info_1 job) 

3、安裝部署

編譯程式,把程式拷到伺服器

然後執行c:\windows\microsoft.net\framework\v2.0.50727\installutil.exe installutil yourproject.exe 安裝服務

解除安裝服務c:\windows\microsoft.net\framework\v2.0.50727\installutil.exe /u yourproject.exe

列印乙份檔案,然後就可以到指定目錄檢視列印日誌了

服務的配置檔案一定要拷貝到c:\windows\system32中

五、總結

通過這個程式學習了服務的開發、讀取xml和c#呼叫api函式,自己開發的優勢是可以把日誌存已自己需要的格式存放在需要的地方,比如配置檔案或者資料庫方便和現有平台的整合。job_info_1所得到的資料比較有限,比如無法取得列印份數等等,通過job_info_2可以取得更多的列印資訊,原理都是一樣的先能用慢慢在修改完善。

六、參考鏈結

**:

php程式 印表機,php程式如何呼叫印表機

php程式如何呼叫印表機 閱讀 80 php程式怎麼呼叫印表機 php控制印表機可以使用php printer擴充套件實現。一 配置 php執行環境正確安裝 apache nginx php 擴充套件檔案新增到ext目錄 編輯php.ini 新增extension php printer.dll 二...

c 餐飲系統印表機 C 呼叫小票印表機

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.drawin...

程式設定印表機配置

程式設定印表機配置 using system using system.ponentmodel using system.runtime.interopservices using system.drawing.printing namespace frontinte ce.printing pub...