• C# WINFORM 强制让窗体获得焦点(可实现单次置顶或持续置顶)


    //首先要说明的是与TopMost的效果不同,TopMost是属性定义,而且设置True后,如果不设为Flase则一直置顶,效果很差,

    //以下方法解决了TopMost使用上的不足

    //调用API
    [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetForegroundWindow(); //获得本窗体的句柄
    [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);//设置此窗体为活动窗体
    //定义变量,句柄类型
    public IntPtr Handle1;

    //在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量

    void Form1_Load(object sender, EventArgs e)
    {
    Handle1 = this.Handle;
    timer2.Enabled = true;
    }

    //加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体

    private void timer2_Tick(object sender, EventArgs e)
    {
    if (Handle1 != GetForegroundWindow()) //持续使该窗体置为最前,屏蔽该行则单次置顶
    {
    SetForegroundWindow(Handle1);

    //timer2.Stop();//此处可以关掉定时器,则实现单次置顶
    }
    }

    示例代码:

     
    namespace WinFormsApp_GetForegroundWindowTest
    {
        public partial class Form1 : Form
        {
            //调用API
            [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]
            public static extern IntPtr GetForegroundWindow(); //获得本窗体的句柄
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
            public static extern bool SetForegroundWindow(IntPtr hWnd);//设置此窗体为活动窗体
            //定义变量,句柄类型
            public IntPtr Handle1;
            Timer timer2 = new Timer();
     
            public Form1()
            {
                InitializeComponent();
            }
     
            Form Form2;
     
            //在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量
            void Form1_Load(object sender, EventArgs e)
            {
                Handle1 = this.Handle;
                timer2.Tick += new EventHandler(timer2_Tick);
                timer2.Interval = 1000;
            }
     
            //加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体
            private void timer2_Tick(object sender, EventArgs e)
            {
                //if (Handle1 != GetForegroundWindow()) //持续使该窗体置为最前,屏蔽该行则单次置顶
                //{
                SetForegroundWindow(Handle1);
                timer2.Stop();//此处可以关掉定时器,则实现单次置顶
                //}
            }
     
            private void btnSetForm2ToTop_Click(object sender, EventArgs e)
            {
                if (Form2 == null) return;
     
                timer2.Enabled = true;
                Handle1 = Form2.Handle;
            }
     
            private void btn_OpenForm2_Click(object sender, EventArgs e)
            {
                Form2 = new Form();
                Form2.Text = "Form2";
                Form2.Show();
            }
        }
    }
     
     
     
     
     
     

    image

  • 相关阅读:
    最终一致性解决实例
    分布式事务一致性方案
    分布式事务
    OSX
    JAVA
    Eclipse
    Activiti
    CentOS
    用Visual Studio 2015 编写 MASM 汇编程序(二)从头开发一个Win32汇编程序
    Oracle
  • 原文地址:https://www.cnblogs.com/jx270/p/2919410.html
Copyright © 2020-2023  润新知