6

2 つのフォームがあり、フォームのTopMostプロパティの 1 つを true に設定しています。プログラムの実行中にどこかで MessageBox を表示しますが、TopMost が true に設定されているため、MessageBox がポップアップすると最上位のフォームの下に表示されるため、表示されません。

  1. フォームの 1 つを常に一番上に表示する方法はありますか?ただし、MessageBox がポップアップしたときに、その特定のフォームの上にメッセージ ボックスを表示するようにしますか?

  2. MessageBox に場所を指定して、中央ではなく、たとえば画面の下部に表示することはできますか?

  3. オレンジ色のフォームを持っているとしましょう。その特定のアプリケーション専用のピンク色のメッセージ ボックスを使用できます。つまり、Windows の色のプロパティを再生することについて言及しているわけではありません。(すべてのメッセージ ボックスをピンク色にしたくありません。)

4

7 に答える 7

11

私はこれを使います。

MessageBox.Show(
                "message",
                "title",
                MessageBoxButtons.OK,
                messageBoxIcon,
                MessageBoxDefaultButton.Button1,
                (MessageBoxOptions)0x40000); // this set TopMost
于 2015-09-05T05:50:36.097 に答える
9

1) MessageBox.Show メソッドには、Window 型の最初のパラメーターを受け取るオーバーロードがあります。Show(string) だけでなく、そのオーバーロードを使用する場合、つまり:

class MyForm : Form {
    void method(){
       MessageBox.Show(this, "blablablablabla");
    }
}

次に、MessageBox が「モーダル」モードで表示され、そのフォームの真上に表示されます。最上位のフォームに合格することを確認するだけで完了です。副作用として、「モーダル」モードでは、メッセージが閉じられるまでメッセージボックスが元のウィンドウをブロックします。

2) いいえ、それは直接できません。ただし、.Net で一生懸命遊んでメッセージボックスへの「ハンドル」を取得し、P/Invoke を介してウィンドウをいくつかの WinApi 関数に移動することはできますが、お勧めしません。

3) いいえ、それは MessageBoxes では不可能です。

MsgBox は単純であるため、(2) と (3) で達成したいことは不可能です。そのためには、メッセージ ボックスとして機能する独自の小さなフォームを作成し、メッセージ ボックスの代わりにそのフォームを表示する必要があります。そのフォームは、任意のスタイル、任意の位置、任意の動作を持つことができます。

于 2012-08-11T00:08:59.007 に答える
5

トップモストの簡単なアプローチは次のMessageBoxようになります。

using (var dummy = new Form() { TopMost = true })
{
    MessageBox.Show(dummy, text, title);
}

実際にダミー フォームを表示する必要はありません。

于 2014-10-24T14:43:23.113 に答える
5

To show a MessageBox on top of all the other forms of your application (including those with TopMost set) you can use the Show() method overload that takes a parameter of type MessageBoxOptions and pass MessageBoxOptions.ServiceNotification as that parameter.

DialogResult result = MessageBox.Show("Configuration file was corrupted.\n\nDo you want to reset it to default and lose all configurations?", "Config File Corrupted", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.ServiceNotification);
于 2015-07-21T11:40:43.617 に答える
1

@セイバー・アマニ:なぜですか?見て、それはうまくいきます:

    using System.Windows.Forms;

    namespace ReusingUserControlsSample
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, System.EventArgs e)
            {
                Form1 second = new Form1();
                second.TopMost = true;
                second.Show();

                MessageBox.Show(second, "BLARGH");
            }

            private void InitializeComponent()
            {
                this.button1 = new System.Windows.Forms.Button();
                this.SuspendLayout();
                this.button1.Location = new System.Drawing.Point(178, 201);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 0;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(284, 264);
                this.Controls.Add(this.button1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);

            }

            private System.Windows.Forms.Button button1;
        }
    }

MSG は、TopMost である 2 番目のフォームの上に正しく表示されます。唯一の「問題」は、どのフォームが一番上にあるかを知ることです。

于 2012-08-11T00:29:29.450 に答える
1

.Net にそれを行うための組み込み機能はないと思いますが、TopMost フォームの参照を保持し、次のように各メッセージを表示する前に変更することをお勧めします。

    public static void ShowMessage(string message)
    {
        Component.InstanceOfTopMost.TopMost = false;
        MessageBox.Show(message);
        Component.InstanceOfTopMost.TopMost = true;
    }

ComponentTopMost である必要があるフォームの参照を保持する静的クラスです。この静的クラスの理由は、そのフォームをいくつかの場所で使用したい場合があるためです。これにより、フォームに簡単にアクセスできます。これは単純な方法であり、要件に基づいて変更できます。

アップデート :

        public class Component
        {
            public static Form2 InstanceOfTopMost { get; set; }
        }

コンポーネントという名前の別の.Netクラスがあるため、コンポーネントは単なる名前に別の名前を付けます。

        var frm = new Form2();
        Component.InstanceOfTopMost = frm;
        frm.Show();

この助けを願っています。

于 2012-08-10T23:38:31.073 に答える
0
https://stackoverflow.com/questions/29326042/show-message-box-in-net-console-application
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox

using System.Runtime.InteropServices;
//...
[DllImport("User32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr h, string m, string c, uint type);
const uint ICONERROR = 16;
const uint ICONWARNING = 48;
const uint ICONINFORMATION = 64;
const uint MB_TOPMOST = 262144;

//...
MessageBox((IntPtr)0, "Started" + DateTime.Now, "Log", ICONINFORMATION | MB_TOPMOST);
于 2020-08-13T14:45:23.640 に答える