none
WPDデバイスのイベントが起こった際の情報取得方法について RRS feed

  • 質問

  • こんにちは。

    WPDデバイス(MTPモード接続)のイベントが発生した際の情報の取得方法を教えていただきたいです。

    開発環境 Visual Studio2008SP1 C++ Windows7 64bit

    WPDデバイス内のディレクトリでファイル追加やファイル名変更などのイベントが起こった際の情報を取得したいと考えています。WPDデバイス内のディレクトリでファイル追加やファイル名変更などのイベントの発生タイミングは

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

    でmessage = WM_DEVICECHANGE;のメッセージを取得したタイミングいいのかなと思っています。

    この後どうすればいいのか困っています。

    WPDのイベント情報として、WPD_EVENT_PARAMETER_EVENT_ID、WPD_OBJECT_NAME、WPD_CLIENT_EVENTCOOKIEなどの情報を取得しようとしています。

    たとえばWPDデバイス内のディレクトリにファイルが追加されたときにWPD_EVENT_PARAMETER_EVENT_IDの値としてWPD_EVENT_OBJECT_ADDEDを取得するといったことです。

    何か情報をお持ちの方教えていただけないでしょうか。よろしくお願いいたします。

    • 移動 星 睦美 2014年12月4日 4:11 Visual C++
    2014年11月19日 5:48

回答

  • WM_DEVICECHANGE メッセージでご要望されているイベントをキャッチすることは不可能だと思います。

    ------------------------------------
    WM_DEVICECHANGE message
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v=vs.85).aspx

    Notifies an application of a change to the hardware configuration of a device or the computer.
    ------------------------------------

    上記サイトでも述べられているように、WM_DEVICECHANGE メッセージで取得できるのは「ハードウェア構成の変更」に関する通知であり、イベントではありません。
    私の知る限り、ご要望されている機能をアプリケーション レベルで実現するのは不可能だと思います。
    MTP 通信を行うモジュールへの API フック、あるいは WPD デバイス クラスにアタッチするフィルタ ドライバを開発すれば、ご要望されている機能の実現は可能ですが、どちらの方法もとても難しいです。
    (そもそも、そんなお手軽な方法で MTP 通信をトラッキングできるのあれば、ベネッセの個人情報流出事件など起こらなかったと思いますし。)

    • 回答としてマーク 星 睦美 2014年12月4日 2:54
    2014年11月20日 4:19
  • > DBT_CUSTUMEVENT のメッセージを受けとった時のタイミングはどうでしょうか。

    ------------------------------------------------------
    DBT_CUSTOMEVENT event
    http://msdn.microsoft.com/ja-jp/library/windows/desktop/aa363204(v=vs.85).aspx

    The system sends the DBT_CUSTOMEVENT device event when a driver-defined custom event has occurred.
    ------------------------------------------------------

    DBT_CUSTOMEVENT は、ドライバ定義のカスタム イベントです。
    別途フィルタ ドライバを開発するのであれば可能だと思いますが、アプリ単体でこのイベント通知を受け取ったところで、意味がないと思います。
    (というか、そもそも DBT_CUSTOMEVENT イベントが通知されてくるかも不明なのでは?)


    > また、WPD_EVENT_PARAMETER_EVENT_ID の値として WPD_EVENT_OBJECT_ADDED を取得する方法はありますでしょうか。

    それらは WPD ドライバが使用する ID であって、アプリ側でどうこうできるものではありません。
    そもそも、それらの ID はドライバ開発の関連サイトに掲載されていたのでは?
    どのような理由で、「アプリ側から利用可能なのでは?」と思われたのでしょうか?

    先にも申し上げましたが、「アプリ単体での実現は無理」というのが、私の見解です。

    • 回答としてマーク yamabukiiro 2014年12月16日 4:05
    2014年11月20日 9:55

すべての返信

  • WM_DEVICECHANGE メッセージでご要望されているイベントをキャッチすることは不可能だと思います。

    ------------------------------------
    WM_DEVICECHANGE message
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v=vs.85).aspx

    Notifies an application of a change to the hardware configuration of a device or the computer.
    ------------------------------------

    上記サイトでも述べられているように、WM_DEVICECHANGE メッセージで取得できるのは「ハードウェア構成の変更」に関する通知であり、イベントではありません。
    私の知る限り、ご要望されている機能をアプリケーション レベルで実現するのは不可能だと思います。
    MTP 通信を行うモジュールへの API フック、あるいは WPD デバイス クラスにアタッチするフィルタ ドライバを開発すれば、ご要望されている機能の実現は可能ですが、どちらの方法もとても難しいです。
    (そもそも、そんなお手軽な方法で MTP 通信をトラッキングできるのあれば、ベネッセの個人情報流出事件など起こらなかったと思いますし。)

    • 回答としてマーク 星 睦美 2014年12月4日 2:54
    2014年11月20日 4:19
  • 返信ありがとうございます。WM_DEVICECHANGEではだめですか。勘違いしていたようです。

    DBT_CUSTUMEVENTのメッセージを受けとった時のタイミングはどうでしょうか。

    また、WPD_EVENT_PARAMETER_EVENT_IDの値としてWPD_EVENT_OBJECT_ADDEDを取得する方法はありますでしょうか。

    難しいですかね。

    2014年11月20日 5:49
  • > DBT_CUSTUMEVENT のメッセージを受けとった時のタイミングはどうでしょうか。

    ------------------------------------------------------
    DBT_CUSTOMEVENT event
    http://msdn.microsoft.com/ja-jp/library/windows/desktop/aa363204(v=vs.85).aspx

    The system sends the DBT_CUSTOMEVENT device event when a driver-defined custom event has occurred.
    ------------------------------------------------------

    DBT_CUSTOMEVENT は、ドライバ定義のカスタム イベントです。
    別途フィルタ ドライバを開発するのであれば可能だと思いますが、アプリ単体でこのイベント通知を受け取ったところで、意味がないと思います。
    (というか、そもそも DBT_CUSTOMEVENT イベントが通知されてくるかも不明なのでは?)


    > また、WPD_EVENT_PARAMETER_EVENT_ID の値として WPD_EVENT_OBJECT_ADDED を取得する方法はありますでしょうか。

    それらは WPD ドライバが使用する ID であって、アプリ側でどうこうできるものではありません。
    そもそも、それらの ID はドライバ開発の関連サイトに掲載されていたのでは?
    どのような理由で、「アプリ側から利用可能なのでは?」と思われたのでしょうか?

    先にも申し上げましたが、「アプリ単体での実現は無理」というのが、私の見解です。

    • 回答としてマーク yamabukiiro 2014年12月16日 4:05
    2014年11月20日 9:55
  • 返信ありがとうございます。

    知識が足りず、すみません。フィルタ ドライバについて勉強してみます。

    ありがとうございました。

    2014年11月20日 11:45