gpt4 book ai didi

c# - 如何为 Windows 7/8 实现自动播放

转载 作者:太空狗 更新时间:2023-10-29 23:18:03 24 4
gpt4 key购买 nike

快速信息:我使用的是 Visual Studio 2008、Windows 8(64 位)。

我正在尝试创建一个自动播放处理程序,当 WPD 设备插入计算机时它会自行显示。如果选择了我的自动播放选项,我只想启动我的应用程序。

由于最近没有任何实现 Windows 自动播放的示例,我希望有人能帮我一点忙并回答几个问题:

1).我创建了一个 ATL 项目,其中包含一个实现 IHWEventHandler 接口(interface)的 COM 对象。最初,我试图让 COM 对象做的只是在我的 C 驱动器中创建一个 .txt 文件以指示它已成功调用。我已经尝试让我的自动播放事件指向这个 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;
}

总的来说,这个实现看起来正确吗?我是否需要实现任何额外的接口(interface)才能让我的自动播放事件调用此 COM 对象?

我知道当我构建项目时,Visual Studio 会自动注册我的 COM 对象。我为 64 位 Windows 构建 COM 对象,并使用 regsvr32.exe 注册 .dll,但这似乎没有帮助。

2).另外,我怀疑我可能没有正确注册我的自动播放注册表项。我首先像这样手动添加我的自动播放事件处理程序:

HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows > CurrentVersion > Explorer > AutoPlayHandlers > Handlers > MyAutoPlayHandler

MyAutoPlayHandler 包含以下内容:

Action 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 > Microsoft > Windows > CurrentVersion > Explorer > AutoPlayHandlers > EventHandlers > WPD > Function > {2D8A6512-A74C-448E-BA8A-F4AC07C49399} 即 WPD_FUNCTIONAL_CATEGORY_ALL

太棒了,所以我插入我的 Android 设备,然后我在自动播放列表中看到了我的自动播放条目。我点击它,但没有任何反应(如我所料,没有在 C 盘中创建 txt 文件)。

所以我另外创建了另一个 key ,如下所示:

HKEY_CLASSES_ROOT > MyAutoPlayDropHandler > shell > 打开 > DropTarget

其中 DropTarget 包含一个 CLSID 值,具有我创建的 COM 对象的 CLSID 思想。我更改了 InvokeProgID 以指向此键,但仍然没有任何反应。

为了实验,我尝试在 ShowPicturesOnArrival 键下添加我的处理程序,当插入包含图像的 USB 驱动器时,然后选择我的自动播放条目,我收到以下错误消息:

“此文件没有与之关联的程序来执行此操作。请安装一个程序,或者,如果已经安装,请在默认程序控制面板中创建一个关联。”

所以现在我对 ShowPicturesOnArrival 键有某种错误响应,但为什么 WPD 没有响应?我怀疑我在某处遗漏了一些东西来让它工作,但我的想法已经用完了。非常感谢我可以尝试解决此问题的任何建议。

最佳答案

我知道这已经有一段时间了,但是对于发现这篇文章的其他人来说,我通过复制 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

关于c# - 如何为 Windows 7/8 实现自动播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15227425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com