現在アプリからプリンタに出力するアプリがあります  
接続切断検知についてなのですが  
LocalPrintServerクラスのGetPrintQueueメソッドからプリンタの状態を取得しているのですが  
取得した状態のうち  
IsOfflineプロパティが常にfalseになってしまいます

USBケーブルを抜き差しすると、デバイスとプリンターのアイコンが  
抜いているときはハーフグレーになるのでOSはプリンタが切れたことを検知しているみたいなのですが  
プログラム上からは常にオンライン(IsOffline=false)となってしまいます(カバーオープンや紙切れは検知するのですが・・・・)

プリンタの接続状態は他に、どのような方法で検知すればいいのでしょうか

今の環境はWindows7/.NetFramework4.5なのですが、Windows8.1やWindows10でも使用できる方法が知りたいです

業務用のプリンタなので最初はそういう仕様なのかと思いましたが、  
デバイスとプリンター上からはちゃんと検知しているので何か標準的な方法が他にあったりするのでしょうか
CC BY-SA 3.0
2016-09-29T02:51:28.060
29229
2017-02-14T08:07:39.967
15047
question
windows visual-studio .net
.NetFrameworkでのプリンタ切断検知
[Trying to determine printer status always returns 0 for offline & online
printers](https://stackoverflow.com/questions/41437023/trying-to-determine-
printer-status-always-returns-0-for-offline-online-printer "Trying to
determine printer status always returns 0 for offline & online printers")

上記の回答を参考にしましたが、プリンターがオフラインかどうかは、WIN32 API の GetPrinter 関数で得られた、PRINTER_INFO_2
構造体の Attributes の値で判定できるようです。

[PDFを画像に変換する](http://d.hatena.ne.jp/feb-hare/20080713 "PDFを画像に変換する")

上記のページに PRINTER_INFO_2 を取得するコードがありました。  
PRINTER_INFO_2 を取得し、下記のようなコードで指定したプリンターがオンラインかどうか判定ができると思います。

```

    PRINTER_INFO_2 printerInfo = GetPrinterInfo("SHARP MX-2610FN SPDL2-c");
    if ((printerInfo.Attributes & PRINTER_ATTRIBUTE_WORK_OFFLINE) > 0)
    {
        label1.Text = "オフライン";
    }
    else
    {
        label1.Text = "オンライン";
    }
    
```
CC BY-SA 3.0
2017-02-14T08:07:39.967
32663
2017-02-14T08:07:39.967
2017-05-23T12:38:56.467
-1
20620
29229
answer