Могу ли я отключить функцию AutoPlay окна с помощью C # /. NET?

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

  •  02-10-2019
  •  | 
  •  

Вопрос

Кто-нибудь знает способ деактивировать функцию автозапуска Windows, используя C # /. Net?

Это было полезно?

Решение

Маленькое резюме, для всех остальных ищет хороший способ отключить / Supress AutoPlay. Пока что я нашел 3 метода, чтобы отключить автозапуск программу:

  1. Перехватить QueryCancelautoPlay сообщение
  2. С использованием Реестр
  3. Реализация интерфейса COM IQUERYCANCELAUTOPLAY

В конце я выбрал 3-й метод и использовал интерфейс iQuerycancelautoPlay, потому что у других были некоторые значительные недостатки:

  • Первый метод (QueryCancelautoPlay) был в состоянии подавить автозагрузку, если окно приложения было на переднем плане, причина Только окно переднего плана получает сообщение
  • Настройка автозаписи в реестре сработало, даже если окно приложения было на заднем плане. Недостатком: требуется перезапуск текущего запущенного Explorer.exe. Вступить в силу ... так что это не было никакого решения временно отключить автозапуск.

Примеры для реализации

1. QueryCancelautoPlay

Примечание. Если ваше приложение использует диалоговое окно, вам нужно позвонить Setwindowlong. (подпись) вместо того, чтобы просто возвращать ложь. Видеть здесь Больше подробностей)

2. Реестр

Используя реестр, вы можете отключить автозагрузку для указанных букв дисков (Nodreiveaureun) или для класса дисков (Nodreivetypeautorun.)

3. IQUERYCANCELAUTOPLAY

Некоторые другие ссылки:

Другие советы

Registerwindowmessage - это вызов API Win32. Таким образом, вам нужно будет использовать pinvoke, чтобы сделать его работать ..

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");

Отсюда (Ссылка на экспертов на вершине). На этом сайте есть дополнительная помощь с некоторыми примерами, которые могут быть немного более всеобъемлющими, чем выше. Выше, однако, решает проблему.

Некоторые дополнительные ссылки, которые могут быть полезны:

Попробуйте этот код Работать для меня :) Для получения дополнительной информации Ознакомьтесь с этой справочной ссылкой: 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top