2016-09-03 2 views
0

TASK 사용자가 양식은 양식이 폐쇄되고 작업이 재개 된 입력 클릭 입력 한 후 나타납니다 팝업을 일시 중지, 문서를 인쇄PRINTERNAME과 작업 ID로 Win32_printJob을 일시 정지하는 방법

.

우리는 50 네트워크 프린터, 2000 클라이언트 머신한 인쇄 서버 있습니다. (또는)을 사용 : 사용자가 문서를 인쇄 할 경우

로컬 (PDF 프린터, XPS 문서 작가 EX)

각 클라이언트는 3 또는 4 프린터

문제가 있었다 네트워크 프린터 (CANON, HP) 인쇄 작업이 즉시 일시 중지되었습니다.

MY 시도

인쇄 문서의 이벤트 리스너보고와 인쇄 작업을 반환합니다.

  • 에서 먼저 작동 때때로 방법을 일시 정지하고 mostof 시간 properly.Because, 그 다음 PrintJob을 검색하지만 이미 인쇄하지 작동하지 않습니다.

  • 이벤트 리스너가 Managementbaseobject를 반환하기 때문에 작동하지 않습니다두 번째 일시 정지 방법에

    하지만 인쇄 작업을 일시 중지하려면

PRINTJOB을 ManageObject하는 ManageBaseObject 변환하는 방법 ManagementObject 필요 사건 수혜자 코드

managementEvent = new ManagementEventWatcher(); 
    managementEvent.Query = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 0.1 WHERE TargetInstance ISA 'Win32_PrintJob'"); 
    managementEvent.Scope = new ManagementScope(@"\root\cimv2"); 
    managementEvent.EventArrived += new EventArrivedEventHandler(printJobArrived_EventArrived); 
    managementEvent.Start(); 

MAIN 액션 코드

private void printJobArrived_EventArrived(object sender, EventArrivedEventArgs e) 
{ 
    try 
    { 
CurrentprintJob = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; 
    } 
    catch(Exception ex){ 

         } 
} 

PRINTJOB METHOD 2

,658을 일시 중지 PRINTJOB METHOD 1

public bool PausePrintJob(string jobname) 
      { 
       bool isActionPerformed = false; 
       try 
       { 
        string searchQuery = "SELECT * FROM Win32_PrintJob WHERE Name LIKE '%"+jobname+"%'"; 

        ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery); 
        ManagementObjectCollection prntJobCollection = searchPrintJobs.Get(); 
        foreach (ManagementObject prntJob in prntJobCollection) 
        { 
           prntJob.InvokeMethod("Pause", null); 
           isActionPerformed = true; 
        } 
       } 
       catch (Exception ex) 
       { 
        new LogFile().WriteErrorLog(ex.StackTrace, ex.Message); 
       } 
       return isActionPerformed; 
      } 

을 일시

+0

간단한 작업을 수행하기에는 어리석은 양의 코드입니다. Nick Westgate의 답변이 자리하고 있습니다. –

답변

2

WMI가 너무 느립니다. FindFirstPrinterChangeNotificationFindNextPrinterChangeNotification을 사용해야 할 수도 있습니다.

theseexamplesuseful이 있습니다.

+0

우리는 50 개의 네트워크 프린터와 200 개의 클라이언트 (사용자를 의미 함)와 하나의 인쇄 서버를 가지고 있습니다 ..... 클라이언트 컴퓨터는 모든 네트워크 프린터로 인쇄합니다 .. 클라이언트가 인쇄를 클릭 할 때 50 대의 컴퓨터를 모니터링하는 방법 .. –

+1

나는 당신을 이해하고 있는지 잘 모르겠습니다. 인쇄물이 인쇄 서버를 통해 인쇄되지 않으면 클라이언트에 소프트웨어가 필요합니다. 서버에서 여러 대의 프린터를 모니터해야하는 경우. 제가 여러분에게 준 두 번째 예제 링크는 이것을 다룹니다. 각 알림 핸들을 기다리는 스레드 풀 스레드가 있습니다. 당신이 할 수있는 다른 방법은 알림 핸들 배열을 가지고 그들 모두를 기다리는 것입니다. –

+0

예 링크를 보았습니다.하지만 프린터를 일시 중지 한 후 프린터를 다시 시작합니다 ... 혼란 스럽습니다 ... 첫 번째 사용자가 이미 프린터를 사용하고 있고 두 번째 사용자가 동일한 프린터를 사용하려고한다고 가정 해보십시오. ... 다시 읽을 것입니다 ... @ Nick.am Windows 응용 프로그램에서 매우 초보자 ... 그래서 .. 사방에 갇혔어요 –

관련 문제