Можно ли программно отключить функцию автозапуска окна с помощью C # / .NET? - PullRequest
5 голосов
/ 29 апреля 2010

Кто-нибудь знает способ деактивировать функцию автозапуска Windows с помощью c # /. NET?

Ответы [ 4 ]

11 голосов
/ 21 сентября 2010

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

  1. Перехват сообщения QueryCancelAutoPlay
  2. Использование Реестра
  3. Реализация интерфейса COM IQueryCancelAutoPlay

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

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

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

1. QueryCancelAutoPlay

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

2. Registry

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

3. IQueryCancelAutoPlay

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

1 голос
/ 29 апреля 2010

RegisterWindowMessage - это вызов Win32 API. Так что вам нужно будет использовать 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");

Отсюда (ссылка «Эксперты-биржа» вверху). На этом сайте есть дополнительная помощь с несколькими примерами, которые могут быть немного более полными, чем приведенные выше. Однако вышесказанное решает проблему.

0 голосов
/ 28 декабря 2016

Попробуйте этот код работать для меня :) Для получения дополнительной информации проверьте эту ссылку: 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
0 голосов
/ 01 мая 2010

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

...