2011-05-30 94 views
5

有關我的previous questionC#窗口頂部沒有打開

在我之前的問題中,我問爲什麼我的對話似乎在其他窗口後面打開。 (其他窗口不一定屬於我的程序,例如Excel,Windows資源管理器等)

我被告知使用重載的ShowDialog()並傳遞父參數。

這很好,我已經有過載全部換成ShowDialog的()秒。

但是我仍然在這裏度過了同樣的問題:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    OpenFileDialog ofd = new OpenFileDialog(); 
    ofd.ShowDialog(); // First dialog 

    // Do some stuff here... 

    SaveFileDialog sfd = new SaveFileDialog(); 
    sfd.ShowDialog(); // Second dialog; 
    } 
} 

在這個例子中(不要在代碼註釋 - 我只是寫它作爲一個簡單的例子),在用戶雙擊可執行文件他們的屏幕上有幾個窗口。 OFD出現在頂部,並且SFD出現在一切之下。

我通常有這種OFD/SFD在我的其中接受CSV或XLS文件,並做他們的一些簡單處理簡單的程序設置。在這種情況下,我將OFD代碼放在靜態Main()方法中,如果沒有參數傳遞給exe,則加載對話框。

+1

不對話需要父窗口中顯示?你在這裏沒有任何窗戶,所以你不應該期望一切都會像你所期望的那樣。 – 2011-05-30 02:13:58

+0

http://stackoverflow.com/questions/4666580/how-can-i-set-topmost-at-the-savefiledialog-using-c/4709536#4709536你有沒有試過這個? :) – Vimvq1987 2011-05-30 03:06:40

+2

我認爲你需要Application.Run作爲一個保持消息泵之間的形式。否則,當第一個表單退出並停止處理消息時,您將失去焦點。 – hsmiths 2011-05-30 03:14:31

回答

1

模態對話框並不意味着以這種方式使用,儘管沒有什麼能阻止你這樣做。

爲shsmith說,你必須有一個Application.Run

對於您在問題中給出的簡單示例,我將顯示一個帶有進度條和/或滾動日誌狀態文本的小窗口。

1

我知道你想避免最上面,但你可以嘗試設置它,然後後立即取消設置它。我在我的一個應用程序中完成了這項工作,它對我來說工作得很好。

+0

是的,這可能是一個解決方案,但正如我在刪除的答案中評論的,ShowDialog()被阻止,Open/SaveFileDialogs沒有TopMost屬性。 – Ozzah 2011-06-03 00:10:24

2

你可以嘗試像下面的(有點哈克):

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Form dummyForm = null; 

     // Create a 'pseudo' invisible form that we make temporarily topmost 
     dummyForm = new Form() { ShowInTaskbar = false, WindowState = FormWindowState.Minimized }; 
     dummyForm.Show(); 
     dummyForm.TopMost = true; 
     dummyForm.TopMost = false; 

     // Use the dummy form as our parent 
     OpenFileDialog ofd = new OpenFileDialog(); 
     ofd.ShowDialog(dummyForm); // First dialog 

     // Do some stuff here... 

     SaveFileDialog sfd = new SaveFileDialog(); 
     sfd.ShowDialog(dummyForm); // Second dialog; 
    } 
} 

的形式給你使用的ShowDialog與父窗口句柄的可能性,並啓動它最小化的伎倆克服的主要問題直接修改窗體的可見性(這可能導致窗體的句柄不被創建)。

+0

我不會稱之爲「_somewhat_ hacky」。 – Ozzah 2011-07-22 06:38:13

+0

你也可以嘗試通過p/invoke來搞定SetWindowsPos(),雖然獲得窗口句柄不僅僅是醜陋的,有些想法可能在這裏找到:[link](http://www.codeproject.com/KB/對話框/ OpenFileDialogEx.aspx) – MrTeatime 2011-07-22 08:26:32

9

有一個其他的 - 我認爲最簡單的 - 解決方案:

 ofd.ShowDialog(new Form() { TopMost=true }); 

它打開一個新的形式,將立即設置,但它會給TopMost屬性您OFD。你可以給更多的屬性,如「頂級」:

 ofd.ShowDialog(new Form() { TopMost=true, TopLevel=true }); 
+1

不錯的破解!謝謝! – 2014-08-28 12:01:41

2

C#控制檯應用程序文件夾瀏覽器對話框最頂層 C#控制檯應用程序打開文件對話框最頂層

[STAThread] 
    static void Main(string[] args) 
    { 
     var threadFolderBrowserDialog = new Thread(voidFolderBrowserDialog); 
     threadFolderBrowserDialog.IsBackground = true; 
     threadFolderBrowserDialog.SetApartmentState(ApartmentState.STA); 
     threadFolderBrowserDialog.Start(); 
     Console.WriteLine("Запуск выбора папки и файла в новом потоке"); 

     bool Exit = false; 
     while (!Exit) 
     { 
      var exit = Console.ReadLine() == "exit" ? Exit = true : Exit = false; 
      Console.WriteLine("Выход из программы по команде exit"); 
     } 
    } 
    [STAThread] 
    static void voidFolderBrowserDialog() 
    { 
     FolderBrowserDialog fbd = new FolderBrowserDialog(); 
     if (fbd.ShowDialog(new Form() { TopMost = true, WindowState = FormWindowState.Minimized }) == DialogResult.OK) 
     { 
      Console.WriteLine(fbd.SelectedPath); 
     } 
     OpenFileDialog ofd = new OpenFileDialog(); 
     if (ofd.ShowDialog(new Form() { TopMost = true, WindowState = FormWindowState.Minimized }) == DialogResult.OK) 
     { 
      Console.WriteLine(ofd.FileName); 
     } 
    }