Frage

kennt jemand eine Möglichkeit, die Autoplay-Funktion von Windows mit C # /. NET deaktivieren?

War es hilfreich?

Lösung

Eine kleine Zusammenfassung, für alle andere die Suche nach einem guten Weg zu deaktivieren / supress automatischer Wiedergabe. Bisher habe ich gefunden 3 Methoden zu deaktivieren automatischen Wiedergabe programmatisch:

  1. Intercepting die QueryCancelAutoPlay Nachricht
  2. Mit dem Registry
  3. Die Implementierung der COM-Schnittstelle IQueryCancelAutoPlay

Am Ende wählte ich die dritte Methode und die IQueryCancelAutoPlay Schnittstelle verwendet, da die anderen einige signifcant Nachteile hatte:

  • Die erste Methode (QueryCancelAutoPlay) war nur in der Lage zu unterdrücken, wenn die automatische Wiedergabe Anwendungsfenster war in den Vordergrund, denn nur das Vordergrundfenster die Nachricht empfängt
  • Konfigurieren von Autoplay in der Registrierung funktioniert auch dann, wenn das Anwendungsfenster im Hintergrund war. Der Nachteil: Es benötigt einen Neustart des aktuell laufenden explorer.exe zu übernehmen ... so ist dies keine Lösung, um vorübergehend deaktivieren Autoplay war.

Beispiele für die Umsetzung

1. QueryCancelAutoPlay

Hinweis: Wenn Ihre Anwendung ein Dialogfeld verwenden Sie anrufen müssen Signatur ) statt nur false zurückgibt. Siehe hier für weitere Details)

2. Registry

die Registrierung verwenden, können Sie deaktiviert AutoRun für bestimmte Laufwerksbuchstaben (NoDriveAutoRun) oder für eine Klasse von Antrieben ( NoDriveTypeAutoRun )

3. IQueryCancelAutoPlay

Einige andere Verbindungen:

Andere Tipps

RegisterWindowMessage ist ein Win32-API-Aufruf. So Sie PInvoke verwenden müssen, um es .. funktioniert

using System.Runtime.InteropServices;

class Win32Call
{
[DllImport("user32.dll")]
   public static extern int RegisterWindowMessage(String strMessage);
}

// In your application you will call

Win32Call.RegisterWindowMessage("QueryCancelAutoPlay");

Von hier (der Experten-Austausch-Link oben). Es gibt zusätzliche Hilfe auf dieser Website mit weiteren Beispielen, die ein wenig umfangreicher als die oben sein können. Die oben ist jedoch das Problem lösen.

Einige zusätzliche Links, die hilfreich sein könnten:

Versuchen Sie diesen Code Arbeit für mich :) Für weitere Informationen lesen Sie in dieser Referenz-Link: http://www.pinvoke.net/default.aspx/user32.registerwindowmessage

using System.Runtime.InteropServices;

//provide a private internal message id
private UInt32 queryCancelAutoPlay = 0;

[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);

/* only needed if your application is using a dialog box and needs to 
* respond to a "QueryCancelAutoPlay" message, it cannot simply return TRUE or FALSE.
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
*/

protected override void WndProc(ref Message m)
{
    //calling the base first is important, otherwise the values you set later will be lost
    base.WndProc (ref m);

    //if the QueryCancelAutoPlay message id has not been registered...
    if (queryCancelAutoPlay == 0)
        queryCancelAutoPlay = RegisterWindowMessage("QueryCancelAutoPlay");

    //if the window message id equals the QueryCancelAutoPlay message id
    if ((UInt32)m.Msg == queryCancelAutoPlay)
    {
        /* only needed if your application is using a dialog box and needs to
        * respond to a "QueryCancelAutoPlay" message, it cannot simply return TRUE or FALSE.
        SetWindowLong(this.Handle, 0, 1);
        */
        m.Result = (IntPtr)1;
    }
} //WndProc
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top