Остановить SetVolumeMountPoint от открытия файлового проводника

Я использую SetVolumeMountPoint для монтирования vhd на букву диска по моему выбору. Проблема в том, что при монтировании vhd файловый менеджер автоматически открывается в новом каталоге диска. Это проблема для меня, так как мне нужно, чтобы мои программы оставались на переднем плане, и иногда созданный проводник файлов становится частью переднего плана.

https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-setvolumemountpointa

Мысли?

ОБНОВИТЬ:

Я программно установил раздел реестра noautorun, используя эти два метода, прежде чем монтировать мой vhd:

        /// <summary>
        /// Removing file explorer auto run for the given DriveLetter so that when a vhd is mounted file explorer doesn't open
        /// </summary>
        /// <param name="DriveLetter"></param>
        private void RemoveFileExplorerAutoRun(char DriveLetter)
        {
            var KeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer";
            RegistryKey AutoRunKey = Registry.CurrentUser.OpenSubKey(KeyPath, true);
            var DriveLetterValue = DriveLetter - 'A';

            if (AutoRunKey != null)
            {
                RemoveFileExplorerAutoRun(AutoRunKey, DriveLetterValue);
            }
            else // create key as it does not exist
            {
                AutoRunKey = Registry.CurrentUser.CreateSubKey(KeyPath);
                RemoveFileExplorerAutoRun(AutoRunKey, DriveLetterValue);
            }
        }

        private void RemoveFileExplorerAutoRun(RegistryKey AutoRunKey, int DriveLetterValue)
        {
            if (AutoRunKey != null)
            {
                AutoRunKey.SetValue("NoDriveTypeAutoRun", DriveLetterValue);
                AutoRunKey.Close();
            }
        }

person Edgar Arakelyan    schedule 03.01.2019    source источник


Ответы (2)


Самый простой способ - это поймать RegisterWindowMessage("QueryCancelAutoPlay") сообщение вашим окном переднего плана и вернуть TRUE из оконной процедуры.

https://docs.microsoft.com/en-us/windows/desktop/shell/autoplay-reg

РЕДАКТИРОВАТЬ: Если окно переднего плана не является окном вашего приложения, я бы рекомендовал не редактировать реестр, поскольку это глобальное состояние, тогда как вам нужен только временный обход автозапуска.

Помимо хуков Windows, упомянутых в другом ответе, я бы предложил зарегистрировать вашу реализацию интерфейс IQueryCancelAutoPlay в таблица бегущих объектов

person Alex Guteniev    schedule 03.01.2019
comment
Похоже, я могу отключить автозапуск для определенных букв дисков из реестра, что является лучшим решением для моего приложения, поскольку я всегда монтирую vhds на определенные буквы дисков, и мое приложение не предназначено для работы в качестве окна переднего плана, но оно порождает другие приложения, которые окно переднего плана. - person Edgar Arakelyan; 04.01.2019
comment
Предлагаю не вносить изменения в реестр, я отредактировал свой ответ - person Alex Guteniev; 04.01.2019

Другой способ - использовать реестр.

Ссылка на "Использование реестра для отключения автозапуска "" Как отключить функцию автозапуска в Windows"

Примечание

Значения NoDriveAutoRun и NoDriveTypeAutoRun должны изменяться только системными администраторами, чтобы изменить значение для всей системы в целях тестирования или администрирования. Приложения не должны изменять эти значения, так как невозможно надежно восстановить их до исходных значений.

Третий способ основан на том, что @Alexander Gutenev указал, что зарегистрируйте сообщение окна "QueryCancelAutoPlay", а затем установите глобальный hook из вашего приложения для отслеживания этого сообщения.

Примечание

Вы должны использовать глобальные ловушки только для целей отладки; в противном случае вам следует избегать их. Глобальные ловушки снижают производительность системы и вызывают конфликты с другими приложениями, которые реализуют глобальную ловушку того же типа.

Хуки имеют тенденцию замедлять работу системы, поскольку они увеличивают объем обработки, которую система должна выполнять для каждого сообщения. Крючок следует устанавливать только при необходимости и снимать как можно скорее.

person Rita Han    schedule 04.01.2019