Могу ли я отключить функцию AutoPlay окна с помощью C # /. NET?
Вопрос
Кто-нибудь знает способ деактивировать функцию автозапуска Windows, используя C # /. Net?
Решение
Маленькое резюме, для всех остальных ищет хороший способ отключить / Supress AutoPlay. Пока что я нашел 3 метода, чтобы отключить автозапуск программу:
- Перехватить QueryCancelautoPlay сообщение
- С использованием Реестр
- Реализация интерфейса COM IQUERYCANCELAUTOPLAY
В конце я выбрал 3-й метод и использовал интерфейс iQuerycancelautoPlay, потому что у других были некоторые значительные недостатки:
- Первый метод (QueryCancelautoPlay) был в состоянии подавить автозагрузку, если окно приложения было на переднем плане, причина Только окно переднего плана получает сообщение
- Настройка автозаписи в реестре сработало, даже если окно приложения было на заднем плане. Недостатком: требуется перезапуск текущего запущенного Explorer.exe. Вступить в силу ... так что это не было никакого решения временно отключить автозапуск.
Примеры для реализации
1. QueryCancelautoPlay
- Подавление автозагрузки программно (Статья MSDN)
- CodeProject: предотвращение компакт-диска из автозагрузки
- Отмена аутоплирования от C #
Примечание. Если ваше приложение использует диалоговое окно, вам нужно позвонить Setwindowlong. (подпись) вместо того, чтобы просто возвращать ложь. Видеть здесь Больше подробностей)
2. Реестр
Используя реестр, вы можете отключить автозагрузку для указанных букв дисков (Nodreiveaureun) или для класса дисков (Nodreivetypeautorun.)
- Использование реестра для отключения AutoRun (Статья MSDN)
- Как включить / отключить автожур для диска (с использованием реестра)
- AutoPlay Windows 7 Включить | Запрещать
3. IQUERYCANCELAUTOPLAY
- Ссылка на iQueryCancelautoPlay Интерфейс на MSDN.
- IQUERYCANCELAUTOPLAY вызывается только один раз? (Пример реализации, а также чтение комментариев)
- Автоплайконтроллер (Еще одна реализация, не проверена)
Некоторые другие ссылки:
- Включение и отключение автожура (Статья MSDN)
- Автозагрузка в Windows XP: автоматически определяет и реагирует на новые устройства в системе (старая, но обширная статья на автозаписи)
Другие советы
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");
Отсюда (Ссылка на экспертов на вершине). На этом сайте есть дополнительная помощь с некоторыми примерами, которые могут быть немного более всеобъемлющими, чем выше. Выше, однако, решает проблему.
Некоторые дополнительные ссылки, которые могут быть полезны:
- Предотвращение компакт-диска из автозагрузки Показывает несколько примеров кода VB.NET, показывающий использование «QueryCancelautoPlay» на CodeProject.
- Включение и отключение автожура на MSDN.
Попробуйте этот код Работать для меня :) Для получения дополнительной информации Ознакомьтесь с этой справочной ссылкой: 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