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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.66415 の関連記事表示

<< 0 >>
■66415  カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY -(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
    サンプルコード-------------ここまで-------------------------
親記事 /過去ログ112より / 関連記事表示
削除チェック/

■66426  Re[1]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ shu -(2013/04/23(Tue) 08:30:20)
    No66415 (YY さん) に返信

    DriveInfo辺りで取得できないですか?
    試してはいません。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66427  Re[2]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY -(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カードなどカードリーダーの抜き差しを検知し
    その有効ドライブを監視したい。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66429  Re[3]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ 774RR -(2013/04/23(Tue) 10:49:21)
    USB フロッピードライブで、フロッピーディスクを使ったことはある?

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

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

    SD カードの抜き差しで WM_DEVICECHANGE が来るタイプのリーダーを使うか
    WM_DEVICECHANGE に頼らず他の方法でチェックするか、どっちかだろう。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66432  Re[4]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY -(2013/04/23(Tue) 11:08:52)
    774RR 様
    ご回答どうもありがとうございます。

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

    おっしゃる通りです。

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

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

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

    WM_DEVICECHANGE に頼らず他にどんな方法があるか教えていただけませんでしょう。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

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

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

    メディアの着脱をいちいち通知しないってことは「いつ抜いてもいい」って意味だ。
    タイマーで定期的に読み込む=ユーザーの着脱とタイミングがかぶる可能性がある。
    たとえ読み込みアクセスであってもアクセス中に抜くのはまずそうな気がする。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66436  Re[5]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ とっちゃん -(2013/04/23(Tue) 12:07:11)
>
    No66432 (YY さん) に返信

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

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

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

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


    もし、このAPIを使っても検出できないという場合は、ポーリングになります。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66446  Re[6]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ YY -(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よ、こんなんことでなぜ簡単に把握できないの!!’)独り言(;´Д`)

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





記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

■66450  Re[7]: カードリーダーによるSDメモリ利用の監視について
□投稿者/ とっちゃん -(2013/04/23(Tue) 17:14:17)
>
    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以降でも変わってないと思います。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

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


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

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


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

    なんとかその部分をVB.NETに変換できないかチャレンジしてみます。(素人ながら・・・(;´Д`))
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/

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

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

    うまく変換できないようなら、ここができない!と質問すれば、VBに詳しい人たちが教えてくれると思いますよ。
    #その時はスレッド分けてピンポイントで質問することをお勧めします。
記事No.66415 のレス /過去ログ112より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -