说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何在后台弹出窗体(窗口置顶)?

编辑:说三道四文库 发布时间:2018-05-23 09:43
HTML文档下载 WORD文档下载 PDF文档下载
好像设置topmost没有效果
比如后台程序(msn)之类的,探出消息框
从后台弹出窗体是什么意思。

Topmost 
或者 ShowDialog()方法来显示窗体。

消息框就是 MessageBox.Show()的各种重载。
 MessageBox.Show()
up
你问题描述清楚啊
一个测试程序
Program.cs
创建TestForm窗体

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace TestTopMost
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new TestForm());
        }
    }
}
TestForm.cs
每1秒产生一个TestMessage窗口

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace TestTopMost
{
    public partial class TestForm : Form
    {
        private System.Timers.Timer m_timer = new System.Timers.Timer(1000);

        private static bool m_bThreadRunning = false;
        private static object privateObjectLock = new object();

        static bool GetThreadRunning()
        {
            bool bReturn = false;
            lock (privateObjectLock)
            {
                bReturn = m_bThreadRunning;
            }
            return bReturn;
        }

        static void SetThreadRunning(bool run)
        {
            lock (privateObjectLock)
            {
                m_bThreadRunning = run;
            }
        }

        public TestForm()
        {
            InitializeComponent();
            m_timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerHandler);

            m_timer.AutoReset = true;
            m_timer.Enabled = true;
        }

        public void TimerHandler(object source, System.Timers.ElapsedEventArgs e)
        {
            Thread thread = new Thread(ThreadFunc);
            thread.Start();
        }

        public static void ThreadFunc()
        {
            if (GetThreadRunning() == false)
            {
                SetThreadRunning(true);

                TestMessage msg = new TestMessage();
                msg.ShowDialog();

                SetThreadRunning(false);
            }
        }
    }
}
TestMessage.cs
弹出1秒钟之后销毁自己

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestTopMost
{
    public partial class TestMessage : Form
    {
        private System.Timers.Timer m_timer = null;

        public TestMessage()
        {
            InitializeComponent();

            m_timer = new System.Timers.Timer(1000);
            m_timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerHandler);
            m_timer.AutoReset = false;
            m_timer.Enabled = true;

            TopMost = true;
        }
        public void TimerHandler(object source, System.Timers.ElapsedEventArgs e)
        {
            Close();
        }
    }
}
这个测试代码无法在当前窗口为其他程序的时候,弹出TestMessage窗体并置顶
后来在form load的时候调用api setforegroundwindow + setwindowpos,可以了

        private System.Timers.Timer m_timer = null;
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern System.IntPtr GetForegroundWindow();
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);


this.Load += delegate 
            {
                if (Handle != GetForegroundWindow())
                    SetForegroundWindow(Handle);
                SetWindowPos(Handle, -1, 0, 0, 0, 0, 1 | 2);
            };
Form frm=new Form1();
frm.TopMost=True;
frm.Show();
winForm里这样:

Form frm=new Form1(); 
frm.TopMost=True; 
frm.Show();

webForm里这样:

            System.Text.StringBuilder sb = new StringBuilder();
            sb.Append("<script>");
            sb.Append("window.open('BBSTieSearch.aspx"','','fullscreen =0,scrollbars=0,toolbar=0,resizable=1,top=100px,left=100px,width=800px,height=500px')");
            sb.Append("</script>");
            Page.ClientScript.RegisterStartupScript(typeof(string), "k1", sb.ToString());
引用 9 楼 bartoooon 的回复:
后来在form load的时候调用api setforegroundwindow + setwindowpos,可以了 

C# code
        private System.Timers.Timer m_timer = null;
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        priv…


厉害!~~
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘