¿Puedo desactivar la función de reproducción automática de Windows mediante programación con C # /. NET?

StackOverflow https://stackoverflow.com/questions/2732792

  •  02-10-2019
  •  | 
  •  

Pregunta

¿Alguien sabe una manera de desactivar la función de reproducción automática de Windows con C # /. NET?

¿Fue útil?

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:

  1. QueryCancelAutoPlay mensaje
  2. Uso de la Registro
  3. 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

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 )

3. IQueryCancelAutoPlay

Algunos otros enlaces:

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:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top