打印機的監視(C語言) |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
打印機的監視(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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |