Deaktiviere ich programmatisch mit C # / Fenster-Autoplay-Funktion. NET?
Frage
kennt jemand eine Möglichkeit, die Autoplay-Funktion von Windows mit C # /. NET deaktivieren?
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:
- Intercepting die QueryCancelAutoPlay Nachricht
- Mit dem Registry
- 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
- Unterdrück AutoRun Programmatically (MSDN-Artikel)
- Codeproject: Verhindern, dass eine CD von Auto-Spielen
- Canceling Autoplay von C #
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 )
- Mit der Registry zu deaktivieren AutoRun (MSDN-Artikel)
- So aktivieren / deaktivieren Autorun für ein Laufwerk (mit Registry)
- Windows 7 Autoplay aktivieren | Deaktivieren
3. IQueryCancelAutoPlay
- Referenz für die IQueryCancelAutoPlay Schnittstelle auf MSDN
- IQueryCancelAutoPlay nur genannt einmal? (Beispiel implementatio, auch Kommentare lesen)
- AutoPlayController (eine andere Implementierung, nicht getestet)
Einige andere Verbindungen:
- Aktivieren und Deaktivieren von AutoRun (MSDN-Artikel)
- Automatische Wiedergabe in Windows XP: Automatisches Erkennen und Reagieren auf neue Geräte in einem System- (ein alte, aber ausführliche Artikel über automatische Wiedergabe)
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:
- Verhindern einer CD aus Auto-Spielen zeigt einige Beispiele vb.net Code, zeigt die Verwendung von "QueryCancelAutoPlay" auf Codeproject.
- Aktivieren und Deaktivieren von AutoRun auf MSDN.
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