虽然模态对话框阻塞了顶层窗体,但是仍然可以通过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;
}
}