2017-08-09 4 views
0

私は助けを必要としています!JNA - 複数のOpenPrinterを取得

私はPrintJob(最後のもの)のすべての情報を取得する必要があります。 問題は次のとおりです。私の会社のコンピュータには、1台のPCに複数のプリンタが搭載されています。 したがって、スプーラレベルで複数のプリンタを監視する必要があります。 私はすでに非常に多くのロジックを試してみましたが、最後のものということでした。

Winspool.PRINTER_INFO_2[] printerInfo2 = WinspoolUtil.getPrinterInfo2(); 

    if (printerInfo2.length == 0) 
     System.out.println("Sem impressoas"); 

    String[] printerNames = new String[printerInfo2.length]; 


    System.out.println(); 

    int arrayIndex = 0; 
    for (Winspool.PRINTER_INFO_2 aPrinterInfo2 : printerInfo2) { 
     printerNames[arrayIndex] = aPrinterInfo2.pPrinterName; 

     //if (aPrinterInfo2.pPrinterName.startsWith("\\")) { 
     //printerNames[arrayIndex] = aPrinterInfo2.pPrinterName.substring(17); 
     //} 
     arrayIndex++; 
    } 
    //endregion 


    HANDLEByReference handleByReference = new HANDLEByReference(); 
    boolean[] printersOpened = new boolean[printerNames.length]; 
    arrayIndex = 0; 
    for (String printerName : printerNames) { 
     printersOpened[arrayIndex] = Winspool.INSTANCE.OpenPrinter(printerName, handleByReference, null); 

     if (!printersOpened[arrayIndex]) { 
      getLastError(); 
     } 
     arrayIndex++; 
    } 

と私はプリンタにアクセス:

WinNT.HANDLE chgObject = Winspool.INSTANCE.FindFirstPrinterChangeNotification(handleByReference.getValue(), 
      Winspool.PRINTER_CHANGE_JOB, 0, null); 

    if (chgObject != null) { 
     while (true) { 
      Kernel32.INSTANCE.WaitForSingleObject(chgObject, 1000); 
      WinDef.DWORDByReference pdwChange = new WinDef.DWORDByReference(); 
      boolean fcnreturn = Winspool.INSTANCE.FindNextPrinterChangeNotification(chgObject, pdwChange, 
        null, null); 

      if (fcnreturn) { 
       Winspool.JOB_INFO_1[] jobInfo1 = WinspoolUtil.getJobInfo1(handleByReference); 

       for (Winspool.JOB_INFO_1 aJobInfo1 : jobInfo1) { 
        System.out.println("-----------xx-----------"); 
        System.out.println(aJobInfo1.pDocument); 
        System.out.println(aJobInfo1.pPrinterName); 
        System.out.println("-----------xx-----------"); 
       } 
       break; 
      } 
     } 
    } 

しかし、私は唯一の最後のインスタンス化プリンタを得ることができます...いずれかがあった場合JNAを介して、ユーザーが選択したプリンタをキャプチャするために、私はそれをまだ見つけていません。

私は質問します。プリンタに頼らずにスプーラを監視するにはどうすればよいですか?

答えて

1

すべてのプリンタ名を取得し、変更を監視するにはEnumPrintersを使用する必要があります。

関連する問題