線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2140
推到 Plurk!
推到 Facebook!

打印機的監視(C語言)

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-15 23:18:30 IP:61.64.xxx.xxx 未訂閱
打印機的監視(C語言) 關鍵字: OpenPrinter, FindFirstChangeNotificaition, ClosePrinter, WaitForSingleObject, FindNextPrinterChangeNotification, FreePrinterNotifyInfo, FindClosePrinterChangeNotification 樣本代碼: void DoPrtNotify() { HANDLE hPrinter = INVALID_HANDLE_VALUE; HANDLE hNotify; BOOL b; PRINTER_NOTIFY_INFO *p; DWORD i; char *pBuf; DWORD *adwData; PRINTER_NOTIFY_OPTIONS no; PRINTER_NOTIFY_OPTIONS_TYPE not[2]; WORD pnf[100], jnf[100]; DWORD ChangeReason; no.Version = 2; no.Count = 2; no.pTypes = not; i = 0; pnf[i ] = PRINTER_NOTIFY_FIELD_SERVER_NAME; pnf[i ] = PRINTER_NOTIFY_FIELD_PRINTER_NAME; pnf[i ] = PRINTER_NOTIFY_FIELD_SHARE_NAME; pnf[i ] = PRINTER_NOTIFY_FIELD_PORT_NAME; pnf[i ] = PRINTER_NOTIFY_FIELD_DRIVER_NAME; pnf[i ] = PRINTER_NOTIFY_FIELD_COMMENT; pnf[i ] = PRINTER_NOTIFY_FIELD_LOCATION; pnf[i ] = PRINTER_NOTIFY_FIELD_SEPFILE; pnf[i ] = PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR; pnf[i ] = PRINTER_NOTIFY_FIELD_PARAMETERS; pnf[i ] = PRINTER_NOTIFY_FIELD_DATATYPE; pnf[i ] = PRINTER_NOTIFY_FIELD_ATTRIBUTES; pnf[i ] = PRINTER_NOTIFY_FIELD_PRIORITY; pnf[i ] = PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY; pnf[i ] = PRINTER_NOTIFY_FIELD_START_TIME; pnf[i ] = PRINTER_NOTIFY_FIELD_UNTIL_TIME; pnf[i ] = PRINTER_NOTIFY_FIELD_STATUS_STRING; pnf[i ] = PRINTER_NOTIFY_FIELD_CJOBS; pnf[i ] = PRINTER_NOTIFY_FIELD_AVERAGE_PPM; pnf[i ] = PRINTER_NOTIFY_FIELD_TOTAL_PAGES; pnf[i ] = PRINTER_NOTIFY_FIELD_PAGES_PRINTED; pnf[i ] = PRINTER_NOTIFY_FIELD_TOTAL_BYTES; pnf[i ] = PRINTER_NOTIFY_FIELD_BYTES_PRINTED; not[0].Type = PRINTER_NOTIFY_TYPE; not[0].Count = i; not[0].pFields = pnf; i=0; jnf[i ] = JOB_NOTIFY_FIELD_PRINTER_NAME; jnf[i ] = JOB_NOTIFY_FIELD_MACHINE_NAME; jnf[i ] = JOB_NOTIFY_FIELD_PORT_NAME; jnf[i ] = JOB_NOTIFY_FIELD_USER_NAME; jnf[i ] = JOB_NOTIFY_FIELD_NOTIFY_NAME; jnf[i ] = JOB_NOTIFY_FIELD_DATATYPE; jnf[i ] = JOB_NOTIFY_FIELD_PRINT_PROCESSOR; jnf[i ] = JOB_NOTIFY_FIELD_PARAMETERS; jnf[i ] = JOB_NOTIFY_FIELD_DRIVER_NAME; jnf[i ] = JOB_NOTIFY_FIELD_STATUS_STRING; jnf[i ] = JOB_NOTIFY_FIELD_DOCUMENT; jnf[i ] = JOB_NOTIFY_FIELD_PRIORITY; jnf[i ] = JOB_NOTIFY_FIELD_POSITION; jnf[i ] = JOB_NOTIFY_FIELD_START_TIME; jnf[i ] = JOB_NOTIFY_FIELD_UNTIL_TIME; jnf[i ] = JOB_NOTIFY_FIELD_TIME; jnf[i ] = JOB_NOTIFY_FIELD_TOTAL_PAGES; jnf[i ] = JOB_NOTIFY_FIELD_PAGES_PRINTED; jnf[i ] = JOB_NOTIFY_FIELD_TOTAL_BYTES; jnf[i ] = JOB_NOTIFY_FIELD_BYTES_PRINTED; not[1].Type = JOB_NOTIFY_TYPE; not[1].Count = 20; not[1].pFields = jnf; b = OpenPrinter( "\\\\ringo\\ringoprt", &hPrinter, NULL); if(!b) { printf("printer can not open(%d)\n", GetLastError()); return; } hNotify = FindFirstPrinterChangeNotification( hPrinter, PRINTER_CHANGE_ALL, 0, &no); if(hNotify == INVALID_HANDLE_VALUE) { printf("find first fail(%d)\n", GetLastError()); ClosePrinter(hPrinter); return; } for(;;) { WaitForSingleObject(hNotify, INFINITE); no.Flags = 0; b = FindNextPrinterChangeNotification( hNotify, &ChangeReason, &no, &p); if(!b) printf("find next error(%d)\n", GetLastError()); printf("\n集會發生...\n"); printf("\t通知理由: "); if(ChangeReason & PRINTER_CHANGE_ADD_PRINTER) printf("打印機追加 "); if(ChangeReason & PRINTER_CHANGE_SET_PRINTER) printf("打印機的設置變更 " ); if(ChangeReason & PRINTER_CHANGE_DELETE_PRINTER) printf("打印機刪除 "); if(ChangeReason & PRINTER_CHANGE_FAILED_CONNECTION_PRINTER) printf("連接失敗 "); if(ChangeReason & PRINTER_CHANGE_ADD_JOB) printf("工作追加 "); if(ChangeReason & PRINTER_CHANGE_SET_JOB) printf("工作設置變更 "); if(ChangeReason & PRINTER_CHANGE_DELETE_JOB) printf("工作刪除 "); if(ChangeReason & PRINTER_CHANGE_WRITE_JOB) printf("工作寫上 "); if(ChangeReason & PRINTER_CHANGE_ADD_FORM) printf("表單追加 "); if(ChangeReason & PRINTER_CHANGE_SET_FORM) printf("表單設置變更 "); if(ChangeReason & PRINTER_CHANGE_DELETE_FORM) printf("表單刪除 "); if(ChangeReason & PRINTER_CHANGE_ADD_PORT) printf("接口追加 "); if(ChangeReason & PRINTER_CHANGE_CONFIGURE_PORT) printf("接口設置變更 "); if(ChangeReason & PRINTER_CHANGE_DELETE_PORT) printf("接口刪除 "); if(ChangeReason & PRINTER_CHANGE_ADD_PRINT_PROCESSOR) printf("打印處理器追加 "); if(ChangeReason & PRINTER_CHANGE_DELETE_PRINT_PROCESSOR) printf("打印處理器刪除 "); if(ChangeReason & PRINTER_CHANGE_ADD_PRINTER_DRIVER) printf("驅動程序追加 "); if(ChangeReason & PRINTER_CHANGE_SET_PRINTER_DRIVER) printf("驅動程序設置變更 "); if(ChangeReason & PRINTER_CHANGE_DELETE_PRINTER_DRIVER) printf("驅動程序刪除 "); if(ChangeReason & PRINTER_CHANGE_TIMEOUT) printf("暫停 "); printf("\n"); if(p != NULL) { for(i=0; iCount; i ) { pBuf = p->aData[i].NotifyData.Data.pBuf; adwData = p->aData[i].NotifyData.adwData; switch(p->aData[i].Type) { case PRINTER_NOTIFY_TYPE: printf("\t打印機通知(no.%d)...", i); switch(p->aData[i].Field) { case PRINTER_NOTIFY_FIELD_SERVER_NAME: printf("先生ba名稱:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_PRINTER_NAME: printf("打印機名稱:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_SHARE_NAME: printf("共有名稱:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_PORT_NAME: printf("接口名稱:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_DRIVER_NAME: printf("驅動程序名稱:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_COMMENT: printf("打印機的說明:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_LOCATION: printf("設置地方:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_DEVMODE: // DEVMODE structure break; case PRINTER_NOTIFY_FIELD_SEPFILE: printf("斷句文件名:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR: printf("打印處理器名稱:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_PARAMETERS: printf("打印處理器的參數:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_DATATYPE: printf("數據的種類:%s\n", pBuf); break; case PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR: // SECURITY_DESCRIPTOR break; case PRINTER_NOTIFY_FIELD_ATTRIBUTES: printf("打印機的狀態:\n"); if(PRINTER_ATTRIBUTE_QUEUED & adwData[0]) printf("\t\t尾白\n"); if(PRINTER_ATTRIBUTE_DIRECT & adwData[0]) printf("\t\t打印機直接數據送\n"); if(PRINTER_ATTRIBUTE_DEFAULT & adwData[0]) printf("\t\t默認\n"); if(PRINTER_ATTRIBUTE_SHARED & adwData[0]) printf("\t\t共有\n"); if(PRINTER_ATTRIBUTE_NETWORK & adwData[0]) printf("\t\t網絡\n"); if(PRINTER_ATTRIBUTE_HIDDEN & adwData[0]) printf("\t\t藏打印機\n"); if(PRINTER_ATTRIBUTE_LOCAL & adwData[0]) printf("\t\t地方的打印機\n"); if(PRINTER_ATTRIBUTE_ENABLE_DEVQ & adwData[0]) printf("\t\t不一致文檔保留\n"); if(PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS & adwData[0]) printf("\t\t印後面文檔剩\n"); if(PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST & adwData[0]) printf("\t\t線軸做了文檔開頭印\n"); if(PRINTER_ATTRIBUTE_WORK_OFFLINE & adwData[0]) printf("\t\t離線印\n"); if(PRINTER_ATTRIBUTE_ENABLE_BIDI & adwData[0]) printf("\t\tenable BIDI(?)\n"); if(PRINTER_ATTRIBUTE_RAW_ONLY & adwData[0]) printf("\t\t直接數據發報喝\n"); break; case PRINTER_NOTIFY_FIELD_PRIORITY: printf("現在的優先次:%d\n", adwData[0]); break; case PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY: printf("默認的優先次:%d\n", adwData[0]); break; case PRINTER_NOTIFY_FIELD_START_TIME: printf("利用可能成為開始時間:d:d\n", adwData[0]/60, adwData[0]`); break; case PRINTER_NOTIFY_FIELD_UNTIL_TIME: printf("利用不可能腹足類爐缸時間:d:d\n", adwData[0]/60, adwData[0]`); break; case PRINTER_NOTIFY_FIELD_STATUS: if(adwData[0] & PRINTER_STATUS_PAUSED) printf("一時(一點)停 "); if(adwData[0] & PRINTER_STATUS_ERROR) printf("錯誤 "); if(adwData[0] & PRINTER_STATUS_PENDING_DELETION) printf("pending_deletion "); if(adwData[0] & PRINTER_STATUS_PAPER_JAM) printf("紙塞滿 "); if(adwData[0] & PRINTER_STATUS_PAPER_OUT) printf("紙排出 "); if(adwData[0] & PRINTER_STATUS_MANUAL_FEED) printf("manual_feed "); if(adwData[0] & PRINTER_STATUS_PAPER_PROBLEM) printf("紙的問題 "); if(adwData[0] & PRINTER_STATUS_OFFLINE) printf("離線 "); if(adwData[0] & PRINTER_STATUS_IO_ACTIVE) printf("io_active "); if(adwData[0] & PRINTER_STATUS_BUSY) printf("busy "); if(adwData[0] & PRINTER_STATUS_PRINTING) printf("印中央 "); if(adwData[0] & PRINTER_STATUS_OUTPUT_BIN_FULL) printf("output_bin_full "); if(adwData[0] & PRINTER_STATUS_NOT_AVAILABLE) printf("not_available "); if(adwData[0] & PRINTER_STATUS_WAITING) printf("待命中央 "); if(adwData[0] & PRINTER_STATUS_PROCESSING) printf("處理中央 "); if(adwData[0] & PRINTER_STATUS_INITIALIZING) printf("初始化中央 "); if(adwData[0] & PRINTER_STATUS_WARMING_UP) printf("warming_up "); if(adwData[0] & PRINTER_STATUS_TONER_LOW) printf("墨粉少 "); if(adwData[0] & PRINTER_STATUS_NO_TONER) printf("墨粉沒 "); if(adwData[0] & PRINTER_STATUS_PAGE_PUNT) printf("page_punt "); if(adwData[0] & PRINTER_STATUS_USER_INTERVENTION) printf("user_intervention "); if(adwData[0] & PRINTER_STATUS_OUT_OF_MEMORY) printf("out_of_memory "); if(adwData[0] & PRINTER_STATUS_DOOR_OPEN) printf("door_open "); if(adwData[0] & PRINTER_STATUS_SERVER_UNKNOWN) printf("server_unknown "); if(adwData[0] & PRINTER_STATUS_POWER_SAVE) printf("power_save "); break; case PRINTER_NOTIFY_FIELD_STATUS_STRING: printf("狀態:%d\n", pBuf); case PRINTER_NOTIFY_FIELD_CJOBS: printf("尾白滾開布良れ稻田工作的數目:%d\n", adwData[0]); break; case PRINTER_NOTIFY_FIELD_AVERAGE_PPM: printf("1頁擊打的平均印時間:%d分\n", adwData[0]); break; case PRINTER_NOTIFY_FIELD_TOTAL_PAGES: printf("總頁數目:%d\n", adwData[0]); break; case PRINTER_NOTIFY_FIELD_PAGES_PRINTED: printf("印頁數目:%d\n", adwData[0]); break; case PRINTER_NOTIFY_FIELD_TOTAL_BYTES: printf("總字節數目:%d\n", adwData[0]); break; case PRINTER_NOTIFY_FIELD_BYTES_PRINTED: printf("印字節數目:%d\n", adwData[0]); break; } break; case JOB_NOTIFY_TYPE: printf("\t工作通知(no.%d, id:%d)...", i, p->aData[i].Id); switch(p->aData[i].Field) { case JOB_NOTIFY_FIELD_PRINTER_NAME: printf("打印機名稱:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_MACHINE_NAME: printf("工作編制元(原來)機器名稱:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_PORT_NAME: printf("接口:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_USER_NAME: printf("工作編制元(原來)客戶名稱:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_NOTIFY_NAME: printf("通知以前客戶:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_DATATYPE: printf("數據的種類:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_PRINT_PROCESSOR: printf("打印處理器名稱:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_PARAMETERS: printf("打印處理器往的參數:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_DRIVER_NAME: printf("驅動程序名稱:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_DEVMODE: // DEVMODE break; case JOB_NOTIFY_FIELD_STATUS: printf("工作的狀態(flag):"); if(adwData[0] & JOB_STATUS_PAUSED) printf("一時(一點)停 "); if(adwData[0] & JOB_STATUS_ERROR) printf("錯誤 "); if(adwData[0] & JOB_STATUS_DELETING) printf("刪除中央 "); if(adwData[0] & JOB_STATUS_SPOOLING) printf("線軸中央 "); if(adwData[0] & JOB_STATUS_PRINTING) printf("印中央 "); if(adwData[0] & JOB_STATUS_OFFLINE) printf("離線 "); if(adwData[0] & JOB_STATUS_PAPEROUT) printf("輸出中央 "); if(adwData[0] & JOB_STATUS_PRINTED) printf("印終了 "); if(adwData[0] & JOB_STATUS_DELETED) printf("刪除終了 "); if(adwData[0] & JOB_STATUS_BLOCKED_DEVQ) printf("blocked_dev_queue "); if(adwData[0] & JOB_STATUS_USER_INTERVENTION) printf("user_intervention "); if(adwData[0] & JOB_STATUS_RESTART) printf("重新啟動 "); printf("\n"); break; case JOB_NOTIFY_FIELD_STATUS_STRING: printf("工作的狀態(msg):%s\n", pBuf); break; case JOB_NOTIFY_FIELD_DOCUMENT: printf("文檔名稱:%s\n", pBuf); break; case JOB_NOTIFY_FIELD_PRIORITY: printf("優先次:%d\n", adwData[0]); break; case JOB_NOTIFY_FIELD_POSITION: printf("順序:%d\n", adwData[0]); break; case JOB_NOTIFY_FIELD_SUBMITTED: //SYSTEMTIME break; case JOB_NOTIFY_FIELD_START_TIME: printf("印開始時間: %d:%d\n", adwData[0]/60, adwData[0]`); break; case JOB_NOTIFY_FIELD_UNTIL_TIME: printf("印終了時間: %d:%d\n", adwData[0]/60, adwData[0]`); break; case JOB_NOTIFY_FIELD_TIME: printf("過去時間: %d: %d\n", adwData[0]/60, adwData[0]`); break; case JOB_NOTIFY_FIELD_TOTAL_PAGES: printf("印總張數: %d\n", adwData[0]); break; case JOB_NOTIFY_FIELD_PAGES_PRINTED: printf("印張數: %d\n", adwData[0]); break; case JOB_NOTIFY_FIELD_TOTAL_BYTES: printf("總字節數目: %d\n", adwData[0]); break; case JOB_NOTIFY_FIELD_BYTES_PRINTED: printf("印字節數目: %d\n", adwData[0]); break; } break; } } b = FreePrinterNotifyInfo(p); if(!b) printf("free error:%d\n",GetLastError()); } } if(hPrinter!=INVALID_HANDLE_VALUE) { ClosePrinter(hPrinter); FindClosePrinterChangeNotification(hNotify); } } ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-19 11:07:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!