35549
**環境**  
Windows10  
開発言語 C# or Python

PCSCデバイスの抜き差しを検知したいのが意図です。しかし、PCSCのAPIには抜き差しをイベントとして検出する機能はないようでした。PCSCデバイスが接続されているかどうかを問い合わせることはできるので、周期的に手動で問い合わせる、という方法でもよいのですが、USBの接続、切断をイベントでキャッチできるなら、そのタイミングでPCSCデバイスのチェックを行いたいと考えています。
CC BY-SA 3.0
2017-06-14T00:43:40.843
35548
2017-06-14T01:27:23.200
17238
question
windows usb
WindowsでUSBデバイスの抜き差しイベントをプログラムから検出したい
`Python` でどうしたいのかよくわかりませんが `C#` というところだけ反応してみます。とりあえず勝手に Form App を仮定してしまいます。

Windows で Plug&Play デバイスの着脱があると (USB に限りません) 、トップレベルウインドウに対してウィンドウメッセージ
`WM_DEVICECHANGE` が送られる仕様となっています。 FormApp であれば Form1.cs 中にて `WndProc`
をオーバーライドすればハンドルすることができます。

`public partial class Form1 : Form { ... }` の `...` 中において

```

    enum WINDOW_MESSAGES : uint
    {
        WM_DEVICECHANGE = 0x0219,
    }
    
    protected override void WndProc(ref Message m)
    {
        switch ((WINDOW_MESSAGES)m.Msg)
        {
            case WINDOW_MESSAGES.WM_DEVICECHANGE:
                pnpEvent(this, EventArgs.Empty);
                break;
        }
        base.WndProc(ref m);
    }
    
```

でイベント `pnpEvent` を起動することができます (`pnpEvent` は自分で作ってください )

無関係な Plug&Play デバイスが着脱されても `WM_DEVICECHANGE`
が送られるので、その辺は要注意・不要なチェックを行うと処理が重いかもしれません。

Win32 native App では `WM_DEVICECHANGE` を受け取るには `RegisterDeviceNotification`
が必要だったのですが .NET App では要らない様子。
CC BY-SA 3.0
2017-06-14T01:27:23.200
35549
2017-06-14T01:27:23.200
8589
35548
answer