【发布时间】:2016-10-14 14:09:11
【问题描述】:
我正在尝试实现一个 AutoPlayHandler,当可移动存储连接到系统时,它会自动将图片导入我的应用程序(基于云的存储客户端,类似于即保管箱)。
我找到了 this question 和 this article on code-project 并完成了所有代码项目文章的解释,但 我无法执行我的处理程序。每次我插入设备时,都会弹出一个消息框,说明“没有注册程序来打开此文件”。
处理程序在控制面板的列表中,我可以选择它。
我做错了什么或错过了什么?
这是我当前的代码:
using System;
using System.IO;
using System.Runtime.InteropServices;
using SpikeAutoPlay.AutoPlayOnArrivalHandler;
namespace MyAutoPlay
{
[ComImport,
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("00000122-0000-0000-C000-000000000046")]
public interface IDropTarget
{
[PreserveSig]
int DragEnter(IntPtr pDataObj, // IDataObject
ulong grfKeyState, // DWORD
POINTL pt,
ref ulong pdwEffect); // DWORD*
[PreserveSig]
int DragOver(ulong grfKeyState, // DWORD
POINTL pt,
ref ulong pdwEffect); // DWORD*
[PreserveSig]
int DragLeave();
[PreserveSig]
int Drop(IntPtr pDataObj, // IDataObject
ulong grfKeyState, // DWORD
POINTL pt,
ref ulong pdwEffect); // DWORD*
}
[ComVisible(true), Guid("06D15143-F98C-48D0-AEA8-F0675C103511")]
public class AutoPlayOnArrivalHandler : IDropTarget
{
public int DragEnter(IntPtr pDataObj,
ulong grfKeyState,
POINTL pt,
ref ulong pdwEffect)
{
return 0; // Not needed for autoplay
}
public int DragOver(ulong grfKeyState,
POINTL pt,
ref ulong pdwEffect)
{
return 0; // Not needed for autoplay
}
public int DragLeave()
{
return 0; // Not needed for autoplay
}
public int Drop(IntPtr pDataObj,
ulong grfKeyState,
POINTL pt,
ref ulong pdwEffect)
{
File.Create("C:\\temp\\works.txt");
return 0;
}
}
}
这是我在注册表中创建的条目:
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows
CurrentVersion
Explorer
AutoplayHandlers
Handlers
SpikeAutoplay
Action [REG_SZ]= SpikeAutoPlay Action Value
DefaultIcon [REG_SZ]= C:\path\to\myApp.ico
InvokeProgID [REG_SZ]= MyAutoPlay.AutoPlayOnArrivalHandler
InvokeVerb [REG_SZ]= import
Provider [REG_SZ]= SpikeAutoPlay Provider Value
HKEY_CLASSES_ROOT
MyAutoPlay.AutoPlayOnArrivalHandler
shell
import
DropTarget
ClSID [REG_SZ]= {{06D15143-F98C-48D0-AEA8-F0675C103511}}
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows
CurrentVersion
Explorer
AutoplayHandlers
EventHandlers
ShowPicturesOnArrival
SpikeAutoplay [REG_SZ]
HKEY_CLASSES_ROOT
CLSID
{06D15143-F98C-48D0-AEA8-F0675C103511}
InprocServer32
(Standard) [RES_SZ] = c:\_sources\MyAutoPlayHander\bin\Debug\MyShellExtensions.dll
ThreadingModel [REG_SZ]= Apartment
【问题讨论】:
-
我在您的消息中没有看到 HKEY_CLASSES_ROOT\CLSID\{06D15143-F98C-48D0-AEA8-F0675C103511}。
-
操作系统位数?扩展位数?
-
扩展是 x86 编译的,操作系统是 win10 x64。我的问题中描述的注册表项已自动复制到 WOW6432Node
-
您的扩展程序也必须是 x64。
-
我现在仔细检查了一下,我错了。我的解决方案平台是 x86 但扩展是编译的 AnyCPU,对不起。您是否注意到我对实际错误的更新? ("没有注册程序来打开这个文件")