0

1 ~ 3 個のファイルを受け入れることができるコンソール プログラムを作成しています。ファイルを受け入れるのに 3 回使用しOpenFileDialogていますが、2 回目と 3 回目はファイル ダイアログがコンソール ウィンドウの背後にあるため、わかりにくくなっています。上に表示させる方法はありますか?

問題のイメージ:

ここに画像の説明を入力

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

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
    ...
}
4

5 に答える 5

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;
}
于 2009-06-09T09:36:27.970 に答える
1

これが質問に直接答えないことは知っていますが、OpenFileDialogには、ユーザーが複数のファイルを選択できるかどうかを示す「MultiSelect」というプロパティがあります。ユーザーがファイルを選択すると、プロパティFileNames(string [])にすべてのファイル名が入力されます。次に、次のようなチェックを行うことができます。

if(dialog.FileNames.Length > 3)
{
   //only 3 are allowed
}
于 2009-05-07T23:29:40.157 に答える
1

私にとって、ダミーのフォームとラベルはまだ問題を解決しませんでした。CodeProject には、http://www.codeproject.com/KB/WPF/MessageBox.aspxに部分的なソリューションがあります。

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

Process p = Process.GetCurrentProcess();
WindowWrapper w = new WindowWrapper(p.MainWindowHandle);
OpenFileDialog ofd = new OpenFileDialog();
var ret = ofd.ShowDialog(w);
...
于 2012-01-09T10:00:44.403 に答える
0

ここで同様の投稿が見つかりました。テストされていませんが、試してみてください。

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);
        }
    }
}
于 2009-05-07T22:58:19.797 に答える
0

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

IWin32Window を受け取るだけなので、フォームは少し重く、おそらく代わりにラベルですか?

OpenFileDialog.ShowDialog(new Label());

うまくいくようです。

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

アーロン

于 2009-12-16T19:51:57.707 に答える