¿Puedo desactivar la función de reproducción automática de Windows mediante programación con C # /. NET?
Pregunta
¿Alguien sabe una manera de desactivar la función de reproducción automática de Windows con C # /. NET?
Solución
Un pequeño resumen, para todos los otros que buscan una buena manera de desactivar la reproducción automática / -supress. Hasta ahora he encontrado 3 métodos para desactivar la reproducción automática mediante programación:
- QueryCancelAutoPlay mensaje
- Uso de la Registro
- La implementación de la interfaz COM IQueryCancelAutoPlay
Al final me eligió el tercero y el método utilizado la interfaz IQueryCancelAutoPlay debido a que los otros tenían algunas desventajas signifcativas:
- El primer método (QueryCancelAutoPlay) sólo fue capaz de para suprimir la reproducción automática si el ventana de la aplicación estaba en el primer plano, causa sólo la ventana de primer plano recibe el mensaje
- Configuración de reproducción automática en el registro trabajó incluso si la ventana de la aplicación estaba en el fondo. La desventaja: Se requiere un reinicio de la actualmente en ejecución explorer.exe para tener efecto ... así que esto no fue una solución para desactivar temporalmente la reproducción automática.
Ejemplos de aplicación
1. QueryCancelAutoPlay
- que suprime la ejecución automática mediante programación (artículo de MSDN)
- CodeProject: La prevención de un CD de auto-Playing
- cancelación de reproducción automática de C #
Nota: Si su aplicación utiliza un cuadro de diálogo que necesita para la llamada SetWindowLong ( firma ) en lugar de falsa que acaban de volver. Ver aquí para más detalles)
2. Registro
Uso del registro Puede desactiva la ejecución automática de letras de unidad especificados (NoDriveAutoRun) o para una clase de unidades ( NoDriveTypeAutoRun )
- Utilizando el registro para deshabilitar la ejecución automática (artículo MSDN)
- Cómo habilitar / deshabilitar la ejecución automática de una unidad de disco (con registro)
- Windows 7 Activar reproducción automática | Desactivar
3. IQueryCancelAutoPlay
- de referencia para el IQueryCancelAutoPlay interfaz en MSDN
- IQueryCancelAutoPlay única llama una vez? (Ejemplo implementatio, también leer los comentarios)
- AutoPlayController (otra implementación, no ensayado)
Algunos otros enlaces:
- Cómo activar y desactivar la ejecución automática (artículo MSDN)
- de reproducción automática en Windows XP: Detectar automáticamente y reaccionar a los nuevos dispositivos en un sistema (un artículo de edad, pero extensa en la reproducción automática)
Otros consejos
RegisterWindowMessage es una llamada a la API de Win32. Por lo que tendrá que utilizar PInvoke para que funcione ..
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");
Desde aquí (el enlace de Expertos-Exchange en la parte superior). Hay ayuda adicional en ese sitio con algunos ejemplos más que pueden ser un poco más amplio que el anterior. Lo anterior no obstante resolver el problema.
Algunos enlaces adicionales que pueden ser útiles:
- La prevención de un CD a partir Auto-Hacer conciertos algunos ejemplos código de vb.net, que muestra el uso de "QueryCancelAutoPlay" en CodeProject.
- Cómo activar y desactivar la ejecución automática en MSDN.
Prueba este código funcione para mí :) Para obtener más información sobre el registro de salida este enlace de referencia: 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