簡體   English   中英

來自類庫的ShowDialog(IWin32Owner)

[英]ShowDialog(IWin32Owner) from Class Library

我有一個類庫,它包含一個“MessageBox”等價物,還有一些鈴聲和口哨聲。

如果我調用ShowDialog(IWin32Owner)方法,這將起作用,表單將顯示在我父表單的中心。

但是,有時,我的項目中的類會調用此表單,因此我無權訪問表單所有者。 在這種情況下,我可以將null傳遞給ShowDialog()方法,但是它似乎無法識別“當前活動窗口”並將其顯示在中心。 我假設因為它在另一個類庫中。

有沒有辦法獲得用戶正在使用的當前活動表單(或至少是屏幕)?

編輯

好吧,這更多地與FormStartPosition枚舉有關。

如果我使用CentreScreen則應根據MSDN默認為當前活動的監視器。 但是,如果表單位於類庫中,則這似乎默認為默認監視器。

好:

這是有問題的代碼: 它無法將窗體設置為中心屏幕:

    public static DialogResult ShowYesNoCancel(string message)
    {
        using (frmMessage form = new frmMessage())
        {
            form.Text = @"Input Required";
            form.lblMessage.Text = message;
            form.btnNo.Visible = true;
            form.btnOK.Text = @"Yes";
            form.btnOK.DialogResult = DialogResult.Yes;
            form.StartPosition = FormStartPosition.CenterScreen;
            return form.ShowDialog();
        }
    }

一個解法:

    /// <summary>
    /// Overridden to ensure its in the centre of the current screen
    /// </summary>
    /// <returns></returns>
    public new DialogResult ShowDialog()
    {
        Screen current = Screen.FromPoint(MousePosition);
        Rectangle s = current.WorkingArea;
        StartPosition = FormStartPosition.Manual;
        Location = new Point(s.Left + s.Width / 2 - Width / 2, s.Top + s.Height / 2 - Height / 2);
        return base.ShowDialog();
    }

您可以使用Form.ActiveForm

獲取此應用程序的當前活動表單。

但是,您的類庫在不知道UI的情況下自行顯示此消息這一事實可能不是一個好兆頭。

這應默認為當前活動的監視器

問題是:如果您有多個,那么這是“當前活動的監視器”? 如果您有兩個或更多,那么這將成為一個混亂的問題,一個輔助監視器或多或少“主動”,然后是主監視器,它同樣能夠顯示窗口。

Winforms使用的啟發式是“顯示鼠標光標的監視器”。 底層的電話是:

  Screen desktop = Screen.FromPoint(Control.MousePosition);

如果要模擬MessageBox.Show()用於查找所有者的行為,請編寫代碼,以便找到當前活動的窗口。 底層的winapi調用是GetActiveWindow() 哪個ShowDialog()已經使用,所以可能會有更多的事情發生,而不是像眼睛一樣,就像一個不是Winforms窗口的活動窗口。 本機MessageBox()winapi函數不介意,但ShowDialog()確實如此。 使用Spy ++來診斷它。

Form.ActiveForm僅在任何形式的應用程序具有焦點時才有效。 因此,如果您的應用程序處於后台,那將毫無幫助。

請改用Application.OpenForms 檢索集合中的最后一項,表示最后一個openend表單。

注意特殊的表單屬性,比如ShowInTaskBar ......它們可能不會出現在這個集合中! 這里描述: https//stackoverflow.com/a/3751748/2243584

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM