2013-03-05 52 views
3

快速信息:我正在使用Visual Studio 2008,Windows 8(64位)。如何實施Windows 7/8的自動播放功能

我試圖創建一個自動播放處理程序,當WPD設備插入到計算機時出現。如果我的自動播放選項被選中,我希望它只是啓動我的應用程序。

由於沒有任何近期實現自動播放的Windows,我希望有人能幫助我一點,並回答幾個問題的例子:

1)。我用一個實現了IHWEventHandler接口的COM對象創建了一個ATL項目。最初,我試圖讓COM對象做的就是在我的C驅動器中創建一個.txt文件,以表明它已成功調用。我試圖讓自動播放事件指向這個COM對象,但是當我選擇自動播放條目時沒有任何反應。這裏是我的.h代碼爲我的COM類:

class ATL_NO_VTABLE CSimpleAutoPlayCom : 
    public CComObjectRootEx<CComSingleThreadModel>, 
    public CComCoClass<CSimpleAutoPlayCom, &CLSID_SimpleAutoPlayCom>, 
    public IHWEventHandler 
    //public ISimpleAutoPlayCom 
    { 
    public: 
    CSimpleAutoPlayCom() 
    { 
     ofstream myfile; 
     myfile.open ("C:\\AutoPlayExerciseWorked.txt"); 
     myfile << "Called from Constructor.\n"; 
     myfile.close(); 
    } 

    DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLEAUTOPLAYCOM) 

    DECLARE_NOT_AGGREGATABLE(CSimpleAutoPlayCom) 

    BEGIN_COM_MAP(CSimpleAutoPlayCom) 
    //COM_INTERFACE_ENTRY(ISimpleAutoPlayCom) 
    COM_INTERFACE_ENTRY(IHWEventHandler) 
    END_COM_MAP() 
    DECLARE_PROTECT_FINAL_CONSTRUCT() 

    HRESULT FinalConstruct() 
    { 
     return S_OK; 
    } 

    void FinalRelease() 
    { 
    } 

    public: 
    // IHWEventHandler 
    STDMETHODIMP Initialize(__RPC__in LPCWSTR pszParams); 
    STDMETHODIMP HandleEvent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR    pszAltDeviceID, __RPC__in LPCWSTR pszEventType); 
    STDMETHODIMP HandleEventWithContent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR pszAltDeviceID, __RPC__in LPCWSTR pszEventType, __RPC__in LPCWSTR pszContentTypeHandler, __RPC__in_opt IDataObject *pdataobject); 

    }; 

這是在.cpp:

// CSimpleAutoPlayCom 
STDMETHODIMP CSimpleAutoPlayCom::Initialize(__RPC__in LPCWSTR pszParams) 
{ 
    ofstream myfile; 
    myfile.open ("C:\\AutoPlayExerciseWorked.txt"); 
    myfile << "Called from Initialize\n"; 
    myfile.close(); 
    return S_OK; 
} 

STDMETHODIMP CSimpleAutoPlayCom::HandleEvent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR pszAltDeviceID, __RPC__in LPCWSTR pszEventType) 
{ 
    ofstream myfile; 
    myfile.open ("C:\\AutoPlayExerciseWorked.txt"); 
    myfile << "Called from HandleEvent.\n"; 
    myfile.close(); 
    return S_OK; 
} 

STDMETHODIMP CSimpleAutoPlayCom::HandleEventWithContent(__RPC__in LPCWSTR pszDeviceID, __RPC__in LPCWSTR pszAltDeviceID, __RPC__in LPCWSTR pszEventType, __RPC__in LPCWSTR pszContentTypeHandler, __RPC__in_opt IDataObject *pdataobject) 
{ 
    ofstream myfile; 
    myfile.open ("C:\\AutoPlayExerciseWorked.txt"); 
    myfile << "Called from HandleEventWithContent.\n"; 
    myfile.close(); 
    return S_OK; 
} 

總體而言,這是否實施看起來是正確的?我是否需要實現任何其他接口才能使我的AutoPlay事件調用此COM對象?

據我所知,當我建立項目時,Visual Studio會自動註冊我的COM對象。我爲64位窗口構建COM對象,並使用regsvr32.exe註冊.dll,但這似乎沒有幫助。 2)。另外,我懷疑可能是我沒有正確註冊我的AutoPlay註冊表項。我第一次手動添加我的自動播放的事件處理程序,像這樣:

HKEY_LOCAL_MACHINE> SOFTWARE>微軟> Windows>系統CURRENTVERSION>瀏覽器> AutoPlayHandlers>處理程序> MyAutoPlayHandler

MyAutoPlayHandler存在以下:

行動REG_SZ MyAction

DefaultIcon REG_SZ(目錄到我的應用程序圖標)

InvokeProgID REG_SZ(由我的ATL生成的HKEY_CLASSES_ROOT下的鍵名稱項目:AutoPlayExericesCom.SimpleAutoPlayCom.1)

InvokeVerb REG_SZ開放

提供商REG_SZ我自己

然後我說MyAutoPlayHandler以下幾點:

HKEY_LOCAL_MACHINE> SOFTWARE>微軟> Windows>系統CURRENTVERSION>瀏覽器> AutoPlayHandlers> EventHandlers> WPD>功能> {2D8A6512-A74C-448E-BA8A-F4AC07C49399}這是WPD_FUNCTIONAL_CATEGORY_ALL

酷,所以我插入我的Android設備e,我在AutoPlay列表中看到了我的AutoPlay條目。我點擊它,沒有任何反應(沒有txt文件在C盤中創建,因爲我期待)。

所以我另外創建一個類似下面的另一個關鍵:MyAutoPlayDropHandler>殼

HKEY_CLASSES_ROOT>>開>的DropTarget

凡DropTarget是否包含與我創建的COM對象的CLSID想法CLSID值。我改變InvokeProgID指向這個鍵,但仍然沒有任何反應。

對於實驗,我嘗試添加我的處理程序ShowPicturesOnArrival項下,並在USB驅動器插入含有圖像時,則選擇我的自動播放入境,我得到了以下錯誤消息:

「此文件沒有與其關聯的程序來執行此操作,請安裝程序,或者如果已安裝,請在「默認程序」控制面板中創建關聯。

因此,現在我對ShowPicturesOnArrival鍵有一些錯誤響應,但爲什麼WPD沒有?我懷疑我錯過了某個地方讓這個工作,但我沒有想法。任何建議,我可以嘗試解決這個問題將不勝感激。

+0

我編輯了這篇文章,使其不那麼通用。 – user2136288 2013-03-07 22:02:44

+0

那麼你是用C#還是C++編寫這個應用程序,因爲你發佈了C++代碼。 – 2013-03-08 05:13:25

+0

在我目前的嘗試中,我正在用C++寫這篇文章。 – user2136288 2013-03-08 14:38:03

回答

0

我知道這已經有一段時間了,但對於任何發現這篇文章的人來說,我已經通過複製VLC自動播放事件的方式解決了這個問題。它不允許你調用正在運行的代碼,但它至少可以讓你用你希望的任何命令行參數調用你的應用程序。

只需將以下注冊表項添加到您的機器中,將VLC替換爲您的應用。

HKEY_CLASSES_ROOT 
    VLC 
     shell 
      import 
      Open 
       command 
        Default = "[Path]\vlc.exe" --started-from-file dvd:///%1 

HKEY_LOCAL_MACHINE 
    SOFTWARE 
     Microsoft 
     Windows 
      CurrentVersion 
       Explorer 
        AutoplayHandlers 
        EventHandlers 
         PlayDVDMovieOnArrival 
          VLCPlayDVDMovieOnArrival [REG_SZ] 
        Handlers 
         VLCPlayDVDMovieOnArrival 
          Action [REG_SZ]= Play DVD Movie 
          DefaultIcon [REG_EXPAND_SZ]= [somepath]\VLC.exe, 0 
          InvokeProgID [REG_SZ]= VLC.DVDMovie 
          InvokeVerb [REG_SZ]= Open 
          Provider [REG_SZ]= VideoLanVLC media player