C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: カードリーダーによるSDメモリ利用の監視について


(過去ログ 112 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■66415 / inTopicNo.1)  カードリーダーによるSDメモリ利用の監視について
  
□投稿者/ YY (4回)-(2013/04/22(Mon) 13:47:13)

分類:[VB.NET/VB2005 以降] 

こんにちは、お世話になります。

XPpro+VB2008

USBデバイスの検出したくいろいろ調べています。
下記のサンプルコードでは、USBデバイスの抜き差しの検知はできるようになっていますが、
ただし、USBメモリリーダーに挿入しても反応しません。この問題を解決したくご質問させていただきました。
どうぞよろしくお願い致します。
参照URL:
ttp://hcs-papa.seesaa.net/article/169705315.html

サンプルコード-------------ここから-------------------------

Private WM_DEVICECHANGE = &H219
Private Enum DBT As Int32
DBT_DEVICEARRIVAL = &H8000
DBT_DEVICEQUERYREMOVE = &H8001
DBT_DEVICEQUERYREMOVEFAILED = &H8002
DBT_DEVICEREMOVEPENDING = &H8003
DBT_DEVICEREMOVECOMPLETE = &H8004
End Enum
Private Enum DBT_DEVICETYPE
DBT_DEVICETYPE_OEM = &H0
DBT_DEVICETYPE_DEVNODE = &H1
DBT_DEVICETYPE_VOLUME = &H2
DBT_DEVICETYPE_PORT = &H3
DBT_DEVICETYPE_NET = &H4
DBT_DEVICETYPE_DEVICEINTERFACE = &H5
DBT_DEVICETYPE_HANDLE = &H6
End Enum
Public Structure DEV_BROADCAST_VOLUME
Public dbcv_size As UInt32
Public dbcv_devicetype As UInt32
Public dbcv_reserved As UInt32
Public dbcv_unitmask As UInt32
End Structure
Protected Overrides Sub WndProc(ByRef m As _
System.Windows.Forms.Message)
Select Case m.Msg
Case WM_DEVICECHANGE
Dim dbv As New DEV_BROADCAST_VOLUME
dbv = _
Marshal.PtrToStructure(m.LParam, _
GetType(DEV_BROADCAST_VOLUME))
If dbv.dbcv_devicetype = _
DBT_DEVICETYPE.DBT_DEVICETYPE_VOLUME Then
Dim drv As String = ""
drv = getDriveString(dbv.dbcv_unitmask)
Select Case m.WParam.ToInt32
Case DBT.DBT_DEVICEARRIVAL
MessageBox.Show(drv & "を取り付けた!")
Case DBT.DBT_DEVICEREMOVECOMPLETE
MessageBox.Show(drv & "を取り外した!")
Case Else
End Select
End If
Case Else
End Select
MyBase.WndProc(m)
End Sub

Private Function getDriveString(ByVal lParam As Int32) As String
getDriveString = ""
Dim I As Integer
For I = 0 To 25
If lParam And 1 Then
Exit For
End If
lParam >>= 1
Next
If I >= 26 Then
Exit Function
End If
getDriveString = Chr(Asc("A") + I)
End Function
サンプルコード-------------ここまで-------------------------
引用返信 編集キー/
■66426 / inTopicNo.2)  Re[1]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ shu (290回)-(2013/04/23(Tue) 08:30:20)
No66415 (YY さん) に返信

DriveInfo辺りで取得できないですか?
試してはいません。
引用返信 編集キー/
■66427 / inTopicNo.3)  Re[2]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY (5回)-(2013/04/23(Tue) 09:17:16)
shu 様
ご回答どうもありがとうございます。


> DriveInfo辺りで取得できないですか?

dim oDrive As IO.DriveInfo
For Each oDrive In IO.DriveInfo.GetDrives
if oDrive.DriveType = IO.DriveType.Removable And oDrive.IsReady Then
debug.print(oDrive.Name)
endif
next

これにより、装着済み(SDカードなどをカードリーダーに挿入し、カードリーダーをPCへ接続済みの状態)でプログラムを実行した場合は
oDrive.Name の結果は得られますが、
ただし、プログラムを実行し、カードリーダーをPCへ接続した状態で、SDカードのみ抜き差しすると無反応です。
なんとかこの状態(プログラムを実行し、カードリーダーをPCへ接続した状態で)でも SDカードなどカードリーダーの抜き差しを検知し
その有効ドライブを監視したい。
引用返信 編集キー/
■66429 / inTopicNo.4)  Re[3]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ 774RR (82回)-(2013/04/23(Tue) 10:49:21)
USB フロッピードライブで、フロッピーディスクを使ったことはある?

USB ドライブ自体の脱着では WM_DEVICECHANGE がやってくるが
ドライブにフロッピーディスクを抜き差ししても WM_DEVICECHANGE は来ないんだ。
同じことが起きているんだろう。

USB カードリーダー自体の脱着では WM_DEVICECHANGE がやってくるが
そのカードリーダーに SD メモリを抜き差ししても WM_DEVICECHANGE は来ないんだろう。

SD カードの抜き差しで WM_DEVICECHANGE が来るタイプのリーダーを使うか
WM_DEVICECHANGE に頼らず他の方法でチェックするか、どっちかだろう。
引用返信 編集キー/
■66432 / inTopicNo.5)  Re[4]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY (6回)-(2013/04/23(Tue) 11:08:52)
774RR 様
ご回答どうもありがとうございます。

> USB ドライブ自体の脱着では WM_DEVICECHANGE がやってくるが
> ドライブにフロッピーディスクを抜き差ししても WM_DEVICECHANGE は来ないんだ。
> 同じことが起きているんだろう。

おっしゃる通りです。

>
> SD カードの抜き差しで WM_DEVICECHANGE が来るタイプのリーダーを使うか

こういうタイプのリーダーもあるのですね。ただ 対応しないリーダーも検知したいので..

> WM_DEVICECHANGE に頼らず他の方法でチェックするか、どっちかだろう。

WM_DEVICECHANGE に頼らず他にどんな方法があるか教えていただけませんでしょう。
引用返信 編集キー/
■66436 / inTopicNo.6)  Re[5]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ とっちゃん (104回)-(2013/04/23(Tue) 12:07:11)
とっちゃん さんの Web サイト
No66432 (YY さん) に返信

> WM_DEVICECHANGE に頼らず他にどんな方法があるか教えていただけませんでしょう。

一応。。。選択肢だけ。
RegisterDeviceNotification API という、デバイスからの通知を受け取るためのメッセージ登録があります。

.NET からはちょっと使いにくいAPIかもしれませんが、メディアの抜き差しもチェックできた気がします。

http://msdn.microsoft.com/en-us/library/aa363217.aspx
ここに、登録できる通知メッセージがいろいろ出てますので、確認してみてください。


もし、このAPIを使っても検出できないという場合は、ポーリングになります。

引用返信 編集キー/
■66437 / inTopicNo.7)  Re[5]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ 774RR (83回)-(2013/04/23(Tue) 12:09:56)
何をどうすべきかは、要望というか案件というか次第だろう。

タイマーでも使って定期的に DriveInfo を取得するとか?
そこまでする必然があるかどうか、あたりから検討が必要そう。

メディアの着脱をいちいち通知しないってことは「いつ抜いてもいい」って意味だ。
タイマーで定期的に読み込む=ユーザーの着脱とタイミングがかぶる可能性がある。
たとえ読み込みアクセスであってもアクセス中に抜くのはまずそうな気がする。
引用返信 編集キー/
■66446 / inTopicNo.8)  Re[6]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY (7回)-(2013/04/23(Tue) 15:35:05)
とっちゃん 様 774RR 様 
ご回答どうもありがとうございます。

> RegisterDeviceNotification API という、デバイスからの通知を受け取るためのメッセージ登録があります。

いろいろ調べてみましたが、下記の記事を見つけました。8年前の記事でした(;゚Д゚)!
http://microsoft.public.jp.visualc.narkive.com/hhXH7VQD

それから、下記のサンプルコードでテストしてみましたが、
やはり、(カードリーダーをPCへ接続した状態で、SDカードを挿入した場合は無反応でした。)
http://timwappat.info/page/ub-funkey-usb-detection-example-vbnet-wpf.aspx

>
> もし、このAPIを使っても検出できないという場合は、ポーリングになります。

タイマーで、774RR様のご指摘のようにあんまり良い方法ではないですが、
残りこの方法しかないでしたら仕方ない。
でも、ちょっと納得行かないですよね。(素人考え’OSよ、こんなんことでなぜ簡単に把握できないの!!’)独り言(;´Д`)

引き続きなにかタイマーなどをつかった良いアイデアご存知でしたらご教示の程宜しくお願い致します。






引用返信 編集キー/
■66450 / inTopicNo.9)  Re[7]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ とっちゃん (107回)-(2013/04/23(Tue) 17:14:17)
とっちゃん さんの Web サイト
No66446 (YY さん) に返信
> とっちゃん 様 774RR 様 
> ご回答どうもありがとうございます。
>
>>RegisterDeviceNotification API という、デバイスからの通知を受け取るためのメッセージ登録があります。
>
> いろいろ調べてみましたが、下記の記事を見つけました。8年前の記事でした(;゚Д゚)!
> http://microsoft.public.jp.visualc.narkive.com/hhXH7VQD
>
懐かしい。。。MSのNewsGroupに投稿したやつだ。
あそこ、検索できたんだ。。。知らなかったw

えっと、かなり面倒ですがこの方法でXPでは検出できてます。
少なくとも当時はピックアップできてました。

当時は、XP以前のOS(2000や9x系)での検出ができなかったので
結果的にはポーリングを選択したんですよねー。
#ちなみにお仕事的に使ってたのは、デジカメメディアの検出


>その後、糸口が見つかり、なんとか検出できるようになりました。

と、書かれてる部分で、SetupDi系 API使ってガチャガチャやってる部分を
使えば、メディアの抜き差しも検出できるようになるはずです。

このあたりは、Vista以降でも変わってないと思います。

引用返信 編集キー/
■66454 / inTopicNo.10)  Re[8]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY (8回)-(2013/04/23(Tue) 17:54:59)
とっちゃん 様
ご回答どうもありがとうございます。


> 懐かしい。。。MSのNewsGroupに投稿したやつだ。

8年前からガチャガチャ(熱意を感じられますヽ〔゚Д゚〕丿スゴイ)


>
> >その後、糸口が見つかり、なんとか検出できるようになりました。
>
> と、書かれてる部分で、SetupDi系 API使ってガチャガチャやってる部分を
> 使えば、メディアの抜き差しも検出できるようになるはずです。
>
> このあたりは、Vista以降でも変わってないと思います。

なんとかその部分をVB.NETに変換できないかチャレンジしてみます。(素人ながら・・・(;´Д`))
引用返信 編集キー/
■66455 / inTopicNo.11)  Re[9]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ とっちゃん (108回)-(2013/04/23(Tue) 18:30:23)
とっちゃん さんの Web サイト
No66454 (YY さん) に返信
> なんとかその部分をVB.NETに変換できないかチャレンジしてみます。(素人ながら・・・(;´Д`))

ざっと見た感じでは、変換はできるんじゃないかな?とは思いますが、P/Invoke苦手なのでよくわからんですw

うまく変換できないようなら、ここができない!と質問すれば、VBに詳しい人たちが教えてくれると思いますよ。
#その時はスレッド分けてピンポイントで質問することをお勧めします。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -