快速信息:我使用的是Visual Studio 2008,Windows 8(64位)。
我正在尝试创建一个自动播放处理程序,当WPD设备插入计算机时自动显示。如果选择了我的自动播放选项,我想要它只是启动我的应用程序。
由于最近没有任何实施Windows自动播放的例子,我希望有人可以帮助我一些并回答几个问题:
1)。我创建了一个带有COM对象的ATL项目,该对象实现了IHWEventHandler接口。最初,我试图让COM对象做的就是在我的C盘中创建一个.txt文件,表明它已被成功调用。我试过让我的AutoPlay事件指向这个COM对象,但是当我选择我的自动播放条目时没有任何反应。这是我的COM类的.h代码:
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注册表项。我首先手动添加我的Autoplay事件处理程序,如下所示:
HKEY_LOCAL_MACHINE&gt;软件&gt;微软&gt; Windows&gt; CurrentVersion&gt;资源管理器&gt; AutoPlayHandlers&gt;处理程序&gt; MyAutoPlayHandler
MyAutoPlayHandler包含以下内容:
动作REG_SZ MyAction
DefaultIcon REG_SZ(我的应用程序图标的目录)
InvokeProgID REG_SZ(由我的ATL项目生成的HKEY_CLASSES_ROOT下的密钥名称:AutoPlayExericesCom.SimpleAutoPlayCom.1)
InvokeVerb REG_SZ open
提供商REG_SZ我自己
然后我将MyAutoPlayHandler添加到以下内容中:
HKEY_LOCAL_MACHINE&gt;软件&gt;微软&gt; Windows&gt; CurrentVersion&gt;资源管理器&gt; AutoPlayHandlers&gt; EventHandlers&gt; WPD&gt;功能&gt; {2D8A6512-A74C-448E-BA8A-F4AC07C49399}是WPD_FUNCTIONAL_CATEGORY_ALL
很酷,所以我插入我的Android设备,然后在AutoPlay列表中看到我的AutoPlay条目。我点击它,没有任何反应(没有像我期望的那样在C盘中创建txt文件。)
所以我另外创建了另一个键,如下所示:
HKEY_CLASSES_ROOT&gt; MyAutoPlayDropHandler&gt; shell&gt;打开&gt; DropTarget的
其中DropTarget包含CLSID值,其中包含我创建的COM对象的CLSID构思。我将InvokeProgID更改为指向此键,但仍然没有任何反应。
对于实验,我尝试在ShowPicturesOnArrival键下添加我的处理程序,当插入包含图像的USB驱动器,然后选择我的自动播放条目时,我收到以下错误消息:
“此文件没有与之关联的程序来执行此操作。请安装程序,如果已安装,则在”默认程序“控制面板中创建关联。”
所以现在我对ShowPicturesOnArrival键有一些错误响应,但为什么没有WPD呢?我怀疑自己错过了某个地方可以让它发挥作用,但我的想法已经不多了。我可以尝试解决这个问题的任何建议都会非常感激。
答案 0 :(得分: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