Kennt jemand eine Möglichkeit, die Autoplay-Funktion von Windows mit c#/.NET zu deaktivieren?
Antworten
Zu viele Anzeigen?Eine kleine Zusammenfassung, für alle anderen, die nach einer guten Möglichkeit suchen, Autoplay zu deaktivieren/unterdrücken. Bislang habe ich 3 Methoden gefunden, um Autoplay programmatisch zu deaktivieren:
- Das Abfangen der QueryCancelAutoPlay-Nachricht
- Die Verwendung des Registry
- Implementierung der COM-Schnittstelle IQueryCancelAutoPlay
Letztendlich habe ich mich für die 3. Methode entschieden und die Schnittstelle IQueryCancelAutoPlay verwendet, weil die anderen einige erhebliche Nachteile hatten:
- Die erste Methode (QueryCancelAutoPlay) war nur in der Lage Autoplay zu unterdrücken, wenn die Anwendungsfenster im Vordergrund war, denn nur das Vordergrundfenster erhält die Nachricht
- Die Konfiguration von Autoplay in der Registrierung funktionierte auch dann, wenn sich das Anwendungsfenster im Hintergrund befand. Der Nachteil: Es erforderte einen Neustart des aktuell laufenden erforscher.exe um in Kraft zu treten... das war also keine Lösung, um Autoplay vorübergehend zu deaktivieren.
Beispiele für die Umsetzung
1. QueryCancelAutoPlay
-
AutoRun programmatisch unterdrücken (MSDN-Artikel)
-
CodeProjekt: Verhindern der automatischen Wiedergabe einer CD
Hinweis: Wenn Ihre Anwendung ein Dialogfeld verwendet, müssen Sie SetWindowLong ( Unterschrift ), anstatt einfach false zurückzugeben. Siehe aquí für weitere Einzelheiten)
2. Registry
Über die Registrierung können Sie AutoRun für bestimmte Laufwerksbuchstaben (NoDriveAutoRun) oder für eine Klasse von Laufwerken deaktivieren ( NoDriveTypeAutoRun )
- Deaktivieren von AutoRun über die Registry (MSDN-Artikel)
- Aktivieren/Deaktivieren von Autorun für ein Laufwerk (über die Registry)
- Windows 7 AutoPlay Aktivieren | Deaktivieren
3. IQueryCancelAutoPlay
- Referenz für die Funktion IQueryCancelAutoPlay Schnittstelle auf MSDN
- IQueryCancelAutoPlay nur einmal aufgerufen? (Beispielimplementierung, lesen Sie auch die Kommentare)
- AutoPlayController (eine andere Implementierung, nicht getestet)
Einige andere Links:
- Aktivieren und Deaktivieren von AutoRun (MSDN-Artikel)
- Autoplay in Windows XP: Automatisches Erkennen und Reagieren auf neue Geräte in einem System (ein alter, aber ausführlicher Artikel über Autoplay)
RegisterWindowMessage ist ein Win32-API-Aufruf. Sie müssen also PInvoke verwenden, damit 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 aus (Der Expertenaustausch-Link ganz oben). Auf dieser Website gibt es zusätzliche Hilfe mit einigen weiteren Beispielen, die vielleicht etwas umfassender sind als die oben genannten. Die obigen Ausführungen lösen jedoch das Problem.
Einige zusätzliche Links, die hilfreich sein könnten:
- Verhindern, dass eine CD von automatisch abspielt zeigt einige Beispiele vb.net-Code, der die Verwendung von "QueryCancelAutoPlay" auf CodeProject.
- Aktivieren und Deaktivieren von AutoRun auf MSDN.
Versuchen Sie diesen Code funktionieren für mich :) Weitere Informationen finden Sie unter diesem Referenzlink: 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