2012-05-31 49 views
0

當插入USB閃存驅動器時,Windows通常打開提供瀏覽驅動器的自動播放對話框,或者是否提供多媒體文件以選擇應用程序打開它們。如何在插入USB閃存驅動器時阻止自動播放和運行我自己的應用程序

我們開發了連接到USB驅動器的媒體播放器,並將其自身註冊爲大容量存儲設備。

我需要的是,當插入播放器,這個對話框沒有顯示,而是我自己的應用程序啓動。

理想情況下,應用程序將在閃存驅動器本身,但據我瞭解,自動運行已禁用USB驅動器。

如果啓動預安裝的應用程序就足夠了。我已經嘗試捕獲WM_DRIVE_CHANGE消息,但這隻適用於我的應用程序是最上面的窗口,否則會顯示自動播放對話框。

最佳 湯姆

+0

那是不可能的當然,它屬於「如果每個人都這樣做呢?」的範疇。 –

+0

發現這兩種解決方案對驅動器插入作出反應,以防止自動播放對話框,即使沒有最頂層窗口也能正常工作: C++:http://www.codeproject.com/Articles/14500/Detecting-Hardware-Insertion-和 - 或 - 刪除 c#:http://www.codeproject.com/Articles/18062/Detecting-US-Drive-Removal-in-aC-Program http://www.dotnet247.com/247reference/ msgs/32/164968.aspx – Thomas

回答

1

後谷歌經過長期的研究,我發現這個論壇的帖子:

http://social.msdn.microsoft.com/Forums/uk-UA/windowssdk/thread/aef929cb-62ac-4371-b7de-2c07adf3c6a7

我跟着這一點,這裏是工作代碼:

[Flags()] 
public enum AutorunContent : int 
{ 
    AutorunInf = 2, 
    AudioCD = 4, 
    DVDMovie = 8, 
    BlankCD = 16, 
    BlankDVD = 32, 
    UnknownContent = 64, 
    AutoPlayPictures = 128, 
    AutoPlayMusics = 256, 
    AutoPlayMovies = 512 
} 


[ComImport] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("DDEFE873-6997-4e68-BE26-39B633ADBE12")] 
public interface IQueryCancelAutoPlay 
{ 
    [PreserveSig] 
    int AllowAutoPlay(
     [MarshalAs(UnmanagedType.LPWStr)] string pszPath, 
     [MarshalAs(UnmanagedType.U4)] AutorunContent dwContentType, 
     [MarshalAs(UnmanagedType.LPWStr)] string pszLabel, 
     [MarshalAs(UnmanagedType.U4)] int dwSerialNumber); 
} 


public class RunningObjectTableEntry : IDisposable 
{ 
    private int cookie; 
    private IRunningObjectTable rot = null; 
    private IMoniker monkey = null; 

    private RunningObjectTableEntry() { } 

    /// <summary> 
    /// Creates a new entry for the given object 
    /// </summary> 
    /// <param name="obj">Object to make an entry for. Only one object per class should ever be registered.</param> 
    public RunningObjectTableEntry(object obj) 
    { 
     int hr = GetRunningObjectTable(0, out rot); 
     if (hr != 0) 
     { 
      throw new COMException("Could not retreive running object table!", hr); 
     } 

     Guid clsid = obj.GetType().GUID; 
     hr = CreateClassMoniker(ref clsid, out monkey); 
     if (hr != 0) 
     { 
      Marshal.ReleaseComObject(rot); 
      throw new COMException("Could not create moniker for CLSID/IID \"" + clsid + "\"!", hr); 
     } 

     cookie = rot.Register(0x01, obj, monkey); //weak reference, but allow any user 
    } 

    [DllImport("ole32.dll", ExactSpelling = true)] 
    private static extern int GetRunningObjectTable([MarshalAs(UnmanagedType.U4)] int reserved, out IRunningObjectTable pprot); 

    [DllImport("ole32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
    private static extern int CreateClassMoniker([In] ref Guid g, [Out] out IMoniker ppmk); 

    #region IDisposable Members 

    /// <summary> 
    /// De-registers the object and class from the Running Object Table 
    /// </summary> 
    public void Dispose() 
    { 
     Marshal.ReleaseComObject(monkey); 
     rot.Revoke(cookie); 
     Marshal.ReleaseComObject(rot); 
    } 

    #endregion 
} 



[ComVisible(true)] 
[Guid("331F1768-05A9-4ddd-B86E-DAE34DDC998A")] 
[ClassInterface(ClassInterfaceType.None)] 
public class Autoplay : IQueryCancelAutoPlay, IDisposable 
{ 
    private RunningObjectTableEntry rotEntry; 

    public Autoplay() 
    { 
     rotEntry = new RunningObjectTableEntry(this); 
    } 

    #region IQueryCancelAutoPlay Members 

    public int AllowAutoPlay(string pszPath, AutorunContent dwContentType, string pszLabel, int dwSerialNumber) 
    { 
     if (pszLabel == "FUNKEYPLAY") //This is the name of my volume that should not call autoplay 
     { 


      return 1; 
     } 
     else 
     { 
      return 0; 
     } 
     //Console.WriteLine("QueryCancelAutoPlay:"); 
     //Console.WriteLine(" " + pszPath); 
     //Console.WriteLine(" " + dwContentType.ToString("x")); 
     //Console.WriteLine(" " + pszLabel); 
     //Console.WriteLine(" " + dwSerialNumber.ToString()); 
    } 

    #endregion 

    #region IDisposable Members 

    public void Dispose() 
    { 
     rotEntry.Dispose(); 
    } 

    #endregion 
} 

}

0

嘗試從您的USB觀看所有的文件。 從文件夾首選項中,您可以選擇顯示/隱藏隱藏文件。 在您的設備上有一個名爲autorun.inf的文件,每次插入USB時都會應用該文件。 因此,如果您打開文件並輸入應用程序的名稱,則每次插入閃光燈時都會自動運行。

+0

不,autorun.inf不適用於USB閃存驅動器 – Thomas

相關問題