2009-05-12 10 views
8

Qtアプリケーションが実行されているコンピュータにUSBデバイスがいつ接続されているかを知りたい(Windowsの場合)。私のメインのQWidgetので、私はこのようなwinEventFilter再実装しました:新しいUSBストレージデバイスがいつQtに接続されるのかを知るには?

bool winEventFilter (MSG * msg, long * result) { 
    qDebug() << msg; 
    return false; 
} 

を私はUSBデバイスを接続したときqDebugは、少なくとも何かを送ることを期待したいが、私は何も得ることはありません。

私はこのプロセスを根本的に誤解していると推測しています。これが私の最初のQtアプリケーションです!

+1

これは面白いです! – AndreasT

+1

@AndreasT - ありがとう! – Skilldrick

+0

まだあなたのプロジェクトがあるのか​​どうかは分かりませんが、参考のためにコピーを入手できれば疑問に思っていました。私はまだwndProcプロシージャをオーバーライドする方法を知らず、まだ良い例は見ていません。私はQtのためにプラットフォーム呼び出しのために良いものを見たことはありません。 ありがとうございます。 –

答えて

5

あなたが見逃している可能性があるのは、デバイス通知を登録する呼び出しです。私は同じことをするために使用するコードですが、winEventFilterではなくQWidgetクラスのwinEvent()メソッドをオーバーライドします。

// Register for device connect notification 
DEV_BROADCAST_DEVICEINTERFACE devInt; 
ZeroMemory(&devInt, sizeof(devInt)); 
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); 
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME; 

m_hDeviceNotify = 
    RegisterDeviceNotification(winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE); 
if(m_hDeviceNotify == NULL) 
{ 
    qDebug() << "Failed to register device notification"; 
} // end if 

注:あなたが最も可能性の高いニーズに合わせてDEV_BROADCAST_DEVICEINTERFACEの値を変更する必要があります。

編集:このコードを使用するには、適切なヘッダーファイルを組み込み、適切な設定を行う必要があります。 DEV_BROADCAST_DEVICEINTERFACEには、Dbt.hヘッダーが含まれている必要があります。また、このコードの焦点はRegisterDeviceNotification関数上にあります。情報は利用可能ですMSDN

+0

申し訳ありませんが、私はDEV_BROADCAST_DEVICEINTERFACEを動作させることができません(エラー: 'DEV_BROADCAST_DEVICEINTERFACE 'はこのスコープで宣言されていません)。余分なヘッダーファイルを含める必要がありますか? – Skilldrick

+0

ごめんなさい。私は自分自身の多くを考え出すのに苦労しました。うまくいけば、私の編集は、私が与えたコードをどのように使うべきか、あなたにいくらか指示を与えるでしょう。それでもまだ完全ではないかもしれません。私はMSDNへのリンクをあなたにもっと情報の源を与えるために含んだ。もっと時間があれば、私はあなたにそれを実装する方法のより完全な方向性を与えようとします。これは本当に少なくともあなたのハンドラにメッセージを取得すべきです。 – brader24

-1

Trolltech mailing listへのリンクは、このリンクが便利です。

+0

私はGoogle経由でそれを見つけましたが、正直言ってそれは私を混乱させました!私は、私が求めている質問にはcが必要だとはかなり信じられませんでした。 150行のコード(これは、そのスレッドで受け入れられた解決策でした)。しかし、ありがとう。 – Skilldrick

+2

ここに来るすべての人にとって、そのリンクは死んでいます。 –

+0

くそー!リンクは実際には死んでいます、どんな更新? – Xsmael

2

私は同じ行で作業していますが、C#で作業しています。

システムにアプリケーションを登録する必要があります(RegisterHidNotification()関数を参照)。鉱山は、次のようになります。 `

void RegisterHidNotification() //Register this application to recieve all USB device notices 

     { 
      BroadcastHeader dbi = new BroadcastHeader(); 
      int size = Marshal.SizeOf(dbi); 
      dbi.Size = size; 
      dbi.Type = DeviceType.DeviceInterface; 
      **dbi.Classguid = GUID_DEVINTERFACE_USB_DEVICE**; 
      dbi.Name = 0; 
      IntPtr buffer = Marshal.AllocHGlobal(size); 
      Marshal.StructureToPtr(dbi, buffer, true); 
      IntPtr r = RegisterDeviceNotification(this.Handle, buffer, (int)DeviceEvents.regWindowHandle); 
      if (r == IntPtr.Zero) 
       statusLabel.Text = GetLastError().ToString(); 
     }` 

機能の最も重要な部分は私が太字で強調しましたビットである(または少なくともしようとしました)。定義済み:public Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); あなたはあなたのアプリケーションにそれを適応させることができますように。

関連する問題