C#-invoke与sendmessage,findWindow的阻塞实验

本文介绍如何在模态对话框阻断窗口交互时,通过FindWindow和SendMessage函数从底层窗体发送消息,实现顶层窗体的逻辑控制。实例演示了如何找到顶层窗体句柄并发送自定义消息来触发延迟操作和更新UI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然模态对话框阻塞了顶层窗体,但是仍然可以通过findwindow查找顶层窗体句柄,并使用sendmessage向顶层窗体发送消息并执行消息内的逻辑(验证实例如下)

public partial class Form6 : Form
    {
        #region
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(
        IntPtr hWnd,        // 信息发往的窗口的句柄  
        int Msg,            // 消息ID  
        int wParam,         // 参数1  
        int lParam
          );
        [DllImport("User32.dll", EntryPoint = "PostMessage")]
        private static extern int PostMessage(
        IntPtr hWnd,        // 信息发往的窗口的句柄  
        int Msg,            // 消息ID  
        int wParam,         // 参数1  
        int lParam
          );

        #endregion
        public const int  MSG =0x402;
        public const int MSG2 = 0x405;
        public Form6(string str="")
        {
            InitializeComponent();
            this.Text = str;
            this.Name = str;
        }
        protected override void DefWndProc(ref Message m)
        {

            switch(m.Msg)
            {
                case MSG:
                    {
                        Task.Factory.StartNew(() =>
                        {
                            Thread.Sleep(2000);
                            this.Invoke(new Action(() => {
                                MessageBox.Show( "bbbbbbbbbb");
                            }));
                         
                        });
                       
                        break;
                    }
                case MSG2:
                    {
                        this.textBox1.Text = "消息有效";
                        break;
                    }
            }

            base.DefWndProc(ref m);


        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("aaaaaaaaaaaa");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            IntPtr ptr = FindWindow(null, "MyForm");
            SendMessage(ptr, MSG, 1, 1);//发送消息  
            Task.Factory.StartNew(() => {
                Thread.Sleep(10000);
                ptr = GetFormPtr("MyForm");
                SendMessage(ptr, MSG2, 1, 1);//发送消息  
            });
        
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Form6 form6 = new Form6();
            form6.ShowDialog();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            
        }
        public static IntPtr GetFormPtr(string formName)
        {
            IntPtr ptr = IntPtr.Zero;
            foreach (Form form in Application.OpenForms)
            {
                if (form.Name == formName)
                {
                    
                    form.Invoke(new Action(() =>
                    {
                        ptr = form.Handle;
                    }));
                    break;
                }
            }
            return ptr;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值