2009-05-07 2 views
0

私は1から3のファイルを受け入れることができるコンソールプログラムを書いています。私はファイルを受け入れるのにOpenFileDialogを3回使っていますが、2回目と3回目にはファイルダイアログがコンソールウィンドウの後ろにあり、気づきにくいです。上に現れるようにするには?2番目と3番目のOpenFileDialogを.NET/C#のコンソールの上に表示させるには?

問題の画像:

enter image description here

関連するコードは、次のとおり

static bool loadFile(ref List<string> ls) 
{ 
    OpenFileDialog f = new OpenFileDialog(); 
    if (f.ShowDialog() == DialogResult.OK) 
    { 
     Console.WriteLine("Loaded file {0}", f.FileName); 
     ls.Add(f.FileName); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

[STAThread] 
static void Main(string[] args) 
{ 
    // sanity check 
    if (args.Length > 3) 
    { 
     Console.WriteLine("Sorry, this program currently supports a maximum of three different reports to analyze at a time."); 
     return; 
    } 
    else if (args.Length == 0) 
    { 
     List<string> fL = new List<string>(); 

     for (int k = 0; k < 3; k++) 
     { 
      if (!loadFile(ref fL)) break; 
     } 

     if (fL.Count == 0) 
     { 
      InfoDisplay.HelpMessage(); 
      return; 
     } 
     else 
     { 
      args = fL.ToArray(); 
     } 
    } 

    // main program 
    ... 
} 

答えて

0

同様のポストhereを発見しました。テストされていませんが、ショットを付けてお知らせください。

foreach(Process p in Process.GetProcesses) 
{ 
    if(p.MainWindowTitle = <the main UI form caption>) 
    { 
     if(IsIconic(p.MainWindowHandle.ToInt32) != 0) 
     { 
      ShowWindow(p.MainWindowHandle.ToInt32, &H1); 
      ShowWindow(f.Handle.ToInt32, &H1); 
     } 
     else 
     { 
      SetForegroundWindow(p.MainWindowHandle.ToInt32); 
      SetForegroundWindow(f.Handle.ToInt32); 
     } 
    } 
} 
+0

System.Windows.Forms.OpenFileDialogにはBringToFrontの定義がありません.... –

+0

はvb.netですか? –

+0

ええ、私はちょうどそれを変換しました。 –

1

私は、これは直接の質問に答えていないけど、OpenFileDialogは、ユーザーが複数のファイルを選択できるかどうかを示す「複数選択」と呼ばれる性質を持っています。ユーザーがファイルを選択すると、プロパティFileNames(string [])にすべてのファイル名が設定されます。

if(dialog.FileNames.Length > 3) 
{ 
    //only 3 are allowed 
} 
+0

しかし、私はユーザがそれを知らず、2または3をロードしたいときにただ一つのファイルを選択するのではないかと思います。 3つすべてをマルチ選択でロードすることは困難です。 –

+3

十分に公正ですが、ユーザーの観点からは、3つの連続したDialogの入力を促すのが面倒なことでしょう。おそらく、3つのテキストボックスと3つのブラウズボタンを持つフォームを考えることができます。私は個人的にそれがもう少しユーザーフレンドリーなIMOになると思う。 – BFree

+0

よくあることですが、私はGUIバージョンとコンソールバージョンを作成しました。何らかの理由でコンソールバージョンがメイン処理に同じコードを使用していても10倍高速です... –

1

コンソールアプリケーションで同じ問題が発生しました。

OpenFileDialog.ShowDialogは、「親ウィンドウ」ハンドル引数を使用して呼び出すことができます。私はダミーのフォームを作成し、それを親ウィンドウの引数として使用します(ダミーフォームはShow()を呼び出さないので表示されません)。

次のコードは、私の作品:

Form dummyForm = new System.Windows.Forms.Form(); 

OpenFileDialog myOpenFileDialog1 = new OpenFileDialog(); 
if (myOpenFileDialog1.ShowDialog(dummyForm) == DialogResult.OK) { 
    fileName1 = myOpenFileDialog1.FileName; 
} 

OpenFileDialog myOpenFileDialog2 = new OpenFileDialog(); 
if (myOpenFileDialog2.ShowDialog(dummyForm) == DialogResult.OK) { 
    fileName2 = myOpenFileDialog2.FileName; 
} 
0

OpenFileDialog.ShowDialogは "親ウィンドウ" 引数を処理して を呼び出すことができます。ダミーフォームを作成し、 親ウィンドウの引数として を使用します(ダミーフォームは表示されません。これは、 はShow()を呼び出さないためです)。

フォームはちょうどIWin32Windowを取るので、ちょっと重い、おそらくラベルです。

OpenFileDialog.ShowDialog(new Label()); 

と思われます。

誰かがこの(現時点で)復活した質問に対する合理的な解決策を思い付くことができたら、それは素晴らしいことです。

Aaron

1

私にとっては、ダミーのフォームとラベルはまだ問題を解決しませんでした。 CodeProjectは、部分的な解決策を持っています

上記の記事のクラスのコンストラクタにProcess.GetCurrent.Process.MainWindowHandleを使用して、インスタンスをファイルダイアログに渡すと、少なくとも私にとってはうまくいくようです。

Process p = Process.GetCurrentProcess(); 
WindowWrapper w = new WindowWrapper(p.MainWindowHandle); 
OpenFileDialog ofd = new OpenFileDialog(); 
var ret = ofd.ShowDialog(w); 
... 
関連する問題