2012-01-18 27 views
1

VisualBasic.Interaction.Shellメソッドを使用してメモ帳ファイルを開きたいとします。現在、次のコードを使用してファイルが見つかりませんでした。なぜInteraction.Shellメソッドでファイルが見つかりませんか?

int pid = Interaction.Shell(@"D:\abc.txt", AppWinStyle.NormalNoFocus, false, -1); 

しかし、これは動作します:ちょうどメモ帳のファイルを開きます

int pid = Interaction.Shell(@"notepad.exe", AppWinStyle.NormalNoFocus, false, -1); 

を。どうしてこれなの?

特定の場所にファイルを開く必要があります。私は、Interaction.Shellの実行でいくつかの利点を参照してください。どのようにInteraction.Shellを使用して特定の場所にファイルを開くことが可能ですか?

+0

Shell()はProcessStartInfo.UseShellExecute = falseのProcess.Start()と同じです。つまり、ドキュメントではなく実行可能プログラムのみを起動することができます。 Processクラスを使用します。 –

+0

@HansPassant私は、process.Start()のように開始するときに、メモ帳と同じ問題を取り上げようとしていました。 VBはそれをとてもうまく処理します。ここからそれを得たhttp://stackoverflow.com/questions/2121911/starting-a-process-without-stealing-focus-cまた、ここで回答者の解決策に取り組んでいます。ありがとう – nawfal

答えて

4

Interaction.Shellは関連ドキュメントでアプリケーションを開くことができないようです。 (a)関連するMSDN pageはそうではない(PathNameのパラメータの例は誤っているように見えるが)、(b)D:\abc.txtが存在しても失敗する。 D:\abc.txtが存在している必要があり、またはあなたはまだFileNotFoundExceptionを得ること

using (Process process = Process.Start(@"D:\abc.txt")) 
{ 
    int pid = process.Id; 

    // Whether you want for it to exit, depends on your needs. Your 
    // Interaction.Shell() call above suggests you don't. But then 
    // you need to be aware that "pid" might not be valid when you 
    // you look at it, because the process may already be gone. 
    // A problem that would also arise with Interaction.Shell. 
    // process.WaitForExit(); 
} 

注:

別の方法としては、System.Diagnostics.Processクラスを使用することができます。あなたが本当にInteraction.Shellを使用する必要がない場合は

更新は、あなたはそれが一般的に起動したプロセスのよりrobusハンドリングを提供して私は、Processクラスに行くと、個人的には以下の

int pid = Interaction.Shell(@"notepad.exe D:\abc.txt", false, -1); 

を使用することができます。この場合、.txtファイルに関連付けられているプログラムを知ることから解放されます(ただし、常にnotepad.exeを使用しない限り)。

+0

完璧なソリューション。私はnotepadの問題をprocess.Start()のような私のwinformsアプリから開くときにフォーカスを取っている。あなたはここにキャッチすることができますhttp://stackoverflow.com/questions/8881038/how-to-set-focus-back-to-form-after-opening-up-a-process-notepad – nawfal

関連する問題