[英]How to implement AutoPlay for image import in c# under windows 10
我正在嘗試實現一個AutoPlayHandler,當可移動存儲連接到系統時,它自動將圖片導入我的應用程序(類似於dropbox的基於雲的存儲客戶端)。
我已經在代碼項目中找到了這個問題和這篇文章,並且所有的代碼項目文章都解釋了但是我無法讓我的處理程序被執行 。 每次插入設備時,都會彈出一個消息框,說明“沒有注冊程序來打開此文件”。
處理程序位於控制面板的列表中,我可以選擇它。
我做錯了什么或錯過了什么?
這是我目前的代碼:
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
如果其他人有這個問題。 這是我最終得到的解決方案:
我完全避免了我最初的實現IDropTarget的想法。 相反,我決定啟動我的應用程序的實例,並只傳遞可移動設備的驅動器號。 然后,應用程序將執行該信息所需的任何操作(在我的情況下,將可移動設備中的特定類型的所有文件復制到另一個驅動器上的特定文件夾)。 由於我的應用程序已經確定啟動時只有一個實例,這對我來說不是問題。
需要創建一個處理程序:
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows
CurrentVersion
Explorer
AutoplayHandlers
Handlers
SpikeAutoplay
Action [REG_SZ]= Import pictures (This value will be shown to the user)
DefaultIcon [REG_SZ]= C:\path\to\myApp.ico
InvokeProgID [REG_SZ]= MyAutoPlay.AutoPlayOnArrivalHandler
InvokeVerb [REG_SZ]= open
Provider [REG_SZ]= human readable app name (This value will be shown to the user as well)
現在,對於作為“InvokeProgID”給出的字符串值,必須有一個具有完全相同值的鍵(請注意,鍵從import和dropTarget更改為open和command )
HKEY_CLASSES_ROOT\HiDrive.AutoPlayOnArrivalHandler
shell
open
command
(Standard) [REG_SZ] = "C:\Path\To\Your\App.exe" %1 (mind the quotes)
%1會將媒體的驅動器號作為參數傳遞給您的應用。
現在,對於您想要進行的每個事件,您必須將事件處理程序添加到相應的子鍵下
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows
CurrentVersion
Explorer
AutoplayHandlers
EventHandlers
例如,如果要處理“ShowPictureOnArrival”事件,則必須添加一個新值[REG_SZ],其中包含事件處理程序的名稱(在本例中為“SpikeAutoplay”)作為值。 例:
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows
CurrentVersion
Explorer
AutoplayHandlers
EventHandlers
ShowPicturesOnArrival
AnotherEventHandler [REG_SZ] =
SpikeAutoplay [REG_SZ] =
YetAnotherEventHandler [REG_SZ] =
有關某些事件處理程序的詳細信息,請訪問此處 。 這個msdn文章是我對這個主題的一般理解來源 - 即使它誤導我實現IDropTarget。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.