簡體   English   中英

如何在Windows 10下的c#中實現AutoPlay進行圖像導入

[英]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”給出的字符串值,必須有一個具有完全相同值的鍵(請注意,鍵從importdropTarget更改為opencommand

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM