
Я только что купил новую мышь SteelSeries. Я пытаюсь запрограммировать кнопку 6, чтобы запустить "SnippingTool.exe".
SnippingTool.exeпоявляетсядолжен находиться по адресу "C:\windows\system32\SnippingTool.exe" или, по крайней мере, отображаться в проводнике Windows таким образом.
Однако в средстве выбора файлов для SteelSeries Engine 3 эта папка не содержит ни одного такого файла.
Более того, приложение «Everything», индексирующее файловую систему NTFS, показывает только два файла SnippingTool.exe, и ни один из них не находится в C:\windows\system32. Вместо этого он, по-видимому, находится в «C:\Windows\WinSxS\amd64_microsoft-windows-snippingtool-app_31bf3856ad364e35_10.0.17134.1_none_7f448e86f2cd59cc\SnippingTool.exe», а также в подпапке «C:\Windows\SoftwareDistribution\Download\". Папка распространения программного обеспечения, вероятно, предназначена для временных файлов, поэтому я предполагаю, что файл в папке WinSxS (Windows Side by Side) на самом деле запущен.
Это становится еще более странным. Если я запускаю SnippingTool.exe из меню «Пуск» или из расположения system32 и смотрю на его расположение в файловой системе в сведениях о TaskManager, он показывает «c:\windows\system32». Между тем, если я назначаю кнопку 6 расположению WinSxS, то попытка запустить его с помощью кнопки 6 просто фокусируется на запущенном экземпляре SnippingTool.exe, поэтому он, похоже, думает, что это то же самое приложение. Однако, если я запускаю его с помощью кнопки 6, когда SnippingToolнетуже запущен, то я просто получаю это пустое диалоговое окно с ошибкой, значок которого является значком ножниц:
Может ли кто-нибудь объяснить это странное поведение или почему такой файл доступен толькопоявляетсябыть расположенным в "c:\windows\system32"? Основываясь на этой информации, где на самом деле находится файл? Я думал, что это может быть символическая ссылка файловой системы, но ни cmd.exe, ни junction64.exe (от Microsoft) не указывают, что у него есть такой атрибут.
Windows, похоже, прикладывает много усилий, чтобы заставить меня думать, что этот файл существует в c:\windows\system32 и не является какой-либо символической ссылкой или соединением... он отображается в проводнике в списке каталогов cmd.exe без каких-либо специальных атрибутов. Однако я не могу выбрать файл в средстве выбора файлов, а мое приложение "Everything", которое обходит Windows и анализирует файловую систему NTFS, говорит, что он там не находится. Все доказательства фактического местоположения файла, похоже, противоречат тому, что Windows пытается мне сказать.
Обходной путь, который обеспечивает более глубокое понимание проблемы
Я попытался создать консольное приложение-оболочку для запуска файла в c:\windows\system32\SnippingTool.exe, но поначалу это не удалось. Например, если я создам консольное приложение C#, которое просто вызовет System.Diagnostics.Process.Start("c:\\windows\\system32\\SnippingTool.exe");
его, то выдаст ошибку «Система не может найти файл, указанный в System.Diagnostics.Process.StartWithShellExecuteEx». Так что это подтверждает идею о том, что этот файл на самом деле не находится там, где его указывает Explorer. Вставка того же пути в диалоговое окно WindowsKey+R (выполнить) работает нормально. Так что каким-то образом Explorer, cmd.exe, диалоговое окно Windows Run сговорились действовать так, как будто этот файл существует, но любая попытка получить к нему прямой доступ показывает, что его на самом деле нет.
Вместо того чтобы запускать файл напрямую, мне удалось запустить его косвенно и без ошибок, передав путь в качестве аргумента explorer.exe следующим образом:System.Diagnostics.Process.Start(new ProcessStartInfo() { UseShellExecute = false, FileName = "c:\\windows\\explorer.exe", Arguments = "c:\\windows\\system32\\SnippingTool.exe" });