
新しい SteelSeries マウスを購入しました。プログラム ボタン 6 で「SnippingTool.exe」を起動しようとしています。
スニッピングツール登場「C:\windows\system32\SnippingTool.exe」にあるか、少なくとも Windows エクスプローラーではそのように表示されます。
ただし、SteelSeries Engine 3 のファイル ピッカーでは、そのフォルダーにはそのようなファイルは含まれていません。
さらに、NTFS ファイル システムをインデックスする「Everything」アプリでは、SnippingTool.exe ファイルが 2 つしか表示されず、どちらも 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) フォルダー内のファイルが実際に起動されるファイルであると推測します。
さらに奇妙なことに、スタートメニューまたは system32 の場所から SnippingTool.exe を起動し、タスクマネージャの詳細でそのファイルシステムの場所を見ると、「c:\windows\system32」と表示されます。一方、ボタン 6 を WinSxS の場所に割り当てると、ボタン 6 で起動しようとすると、実行中の SnippingTool.exe のインスタンスにフォーカスが当てられるため、同じアプリケーションであると認識されるようです。ただし、SnippingTool が起動しているときにボタン 6 で起動すると、ないすでに実行中の場合は、次の空白のエラー ダイアログが表示されます。このダイアログのアイコンは、スニッピング ツールのアイコンです。
この奇妙な動作を説明できる人はいますか?または、なぜこのようなファイルが登場「c:\windows\system32」に配置されているのでしょうか? この情報に基づくと、ファイルは実際にはどこに配置されているのでしょうか? ファイル システムのシンボリック リンクである可能性があると思いましたが、cmd.exe または junction64.exe (Microsoft 製) のどちらにも、そのような属性があることは示されていません。
Windows は、このファイルが c:\windows\system32 に存在し、シンボリック リンクやジャンクションではないと思わせるために、多大な労力を費やしているようです... エクスプローラーの cmd.exe ディレクトリ リストには、特別な属性なしで表示されます。ただし、ファイル ピッカーでファイルを実際に選択することはできません。Windows をバイパスして NTFS ファイル システムを解析する「Everything」アプリは、そこにファイルが存在しないと言います。ファイルの実際の場所に関するすべての証拠は、Windows が伝えようとしていることと矛盾しているようです。
問題に対するより深い洞察を提供する回避策
c:\windows\system32\SnippingTool.exe にあるファイルを起動するラッパー コンソール アプリケーションを作成しようとしましたが、最初は失敗しました。たとえば、System.Diagnostics.Process.Start("c:\\windows\\system32\\SnippingTool.exe");
それを呼び出すだけの C# コンソール アプリケーションを作成すると、「システムは System.Diagnostics.Process.StartWithShellExecuteEx で指定されたファイルを見つけることができません」というエラーがスローされます。これは、このファイルが実際にはエクスプローラーが示す場所にないという考えを裏付けています。WindowsKey+R (実行) ダイアログ ボックスに同じパスを貼り付けると、問題なく機能します。つまり、どういうわけか、エクスプローラー、cmd.exe、Windows 実行ダイアログはすべて、このファイルが存在するかのように動作していますが、ファイルに直接アクセスしようとすると、実際には存在しないことが明らかになります。
ファイルを直接起動するのではなく、次のようにパスを explorer.exe に引数として渡すことで、エラーなしで間接的に起動することができました。System.Diagnostics.Process.Start(new ProcessStartInfo() { UseShellExecute = false, FileName = "c:\\windows\\explorer.exe", Arguments = "c:\\windows\\system32\\SnippingTool.exe" });