3

スタート メニューのショートカットに基づいてプログラムを起動しようとしています。特に、スタート メニューのショートカットに基づいて PowerPoint を起動しようとしています。これを実現するために、IWshRuntimeLibrary を使用しています。

static void Main(string[] args)
{
    string searchTerm = "powerpoint";

    string startMenu = Environment
        .GetFolderPath(Environment.SpecialFolder.CommonStartMenu);

    string shortcutPath = Directory
        .GetFiles(startMenu, "*.lnk", SearchOption.AllDirectories)
        .OrderBy(p => p.Length)
        .First(p => p.ToLower().Contains(searchTerm));

    WshShell shell = new WshShell();

    IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutPath);

    Console.WriteLine(shortcut.TargetPath); //prints: C:\Windows\Installer\{90140000-0011-0000-0000-0000000FF1CE}\pptico.exe

    Process.Start(shortcut.TargetPath, shortcut.Arguments);
}

ショートカットを見つけて、IWshShortcut オブジェクトを作成することができました。ただし、(Process.Start(shortcut.TargetPath, Shortcut.Arguments) 経由で) ショートカットのバッキング アプリケーションを実行しようとすると、Win32Exception が発生します。

System.ComponentModel.Win32Exception was unhandled
  Message=The specified executable is not a valid application for this OS platform.
  Source=System
  ErrorCode=-2147467259
  NativeErrorCode=193
  StackTrace:
       at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
       at System.Diagnostics.Process.Start()
       at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
       at System.Diagnostics.Process.Start(String fileName, String arguments)
       at Scratch.Program.Main(String[] args) in C:\Users\jhampton\Documents\Visual Studio 2010\Projects\Scratch\Scratch\Program.cs:line 26
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

私が見つけた唯一の関連する答えは、この議論にありました。私のプロジェクトはすでに x86 アプリケーションとしてビルドされていました

関連しているように見えるので、ここに私のシステムの背景をいくつか示します。Windows 7 Professional 64 ビットを実行しており、Microsoft Office 2010 がインストールされています。これは、Visual Studio 2010 で記述されたコンソール アプリケーションの一部であり、.NET Framework 4 Client Profile を対象としています。

次の代替ソリューションを調査中です。

Windows API コード パック: http://code.msdn.microsoft.com/WindowsAPICodePack
IWshRuntimeLibrary を使用しないショートカット: c# で .lnk を解決する方法

賢明なリンクの欠如について申し訳ありません。これは私の最初の投稿であり、どうやらタグを使用して複数を挿入することはできません。

4

1 に答える 1

2

これは単純に機能するはずです:

Process.Start(shortcutPath);

lnk を開く必要はありません。Windows に実行を依頼するだけです。舞台裏で、Process.Start は、.lnk の処理方法を認識しているShellExecuteを実行します。

于 2010-12-16T07:08:00.683 に答える