窗体Form1上有一个Panel控件panel1.
private void panel1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("OK");
}单击panel1,弹出对话框后,不结束对话框,我可以选择桌面上的图标,启动其他的程序。
但在panel1的panel1_DragDrop事件中,如下:
private void panel1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
} private void panel1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
MessageBox.Show("ok");
}如果拖一个文件或者文件夹上去,弹出对话框,此时桌面上的图标则不能选中,这是为何?我就是想在这个应用程序中弹出对话框后,不去确认,去选中桌面上的其他图表和程序,谁有办法解决???
private void panel1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("OK");
}单击panel1,弹出对话框后,不结束对话框,我可以选择桌面上的图标,启动其他的程序。
但在panel1的panel1_DragDrop事件中,如下:
private void panel1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
} private void panel1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
MessageBox.Show("ok");
}如果拖一个文件或者文件夹上去,弹出对话框,此时桌面上的图标则不能选中,这是为何?我就是想在这个应用程序中弹出对话框后,不去确认,去选中桌面上的其他图表和程序,谁有办法解决???
可能和你拖动文件有关, 你程序挂起在messagebox那里, 而桌面上的资源因为该消息而被锁住。
而第一种只是单击panel消息, 桌面上的资源肯定不会被锁住。
仅仅猜测
while(!continueFlag)//continueFlag是程序继续执行的标志
{
System.Threading.Thread.Sleep(300);
}
……因为你是几个程序互动的执行,这个标志应该是从文件或注册表中读出来到, 可能需要你在另一个程序中写入它。
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;namespace WindowsApplication1
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null; public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent(); //
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
} /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
} #region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.AllowDrop = true;
this.panel1.Controls.Add(this.button1);
this.panel1.Location = new System.Drawing.Point(48, 88);
this.panel1.Name = "panel1";
this.panel1.TabIndex = 0;
this.panel1.DragEnter += new System.Windows.Forms.DragEventHandler(this.panel1_DragEnter);
this.panel1.DragDrop += new System.Windows.Forms.DragEventHandler(this.panel1_DragDrop);
//
// button1
//
this.button1.Location = new System.Drawing.Point(56, 40);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.button1_MouseDown);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.panel1);
this.Name = "Form1";
this.Text = "Form1";
this.panel1.ResumeLayout(false);
this.ResumeLayout(false); }
#endregion /// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
} private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.panel1.DoDragDrop(this.button1,DragDropEffects.Copy);
} private void panel1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
MessageBox.Show("ok");
} private void panel1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
}
}
然后在panel1_DragDrop里写timer1.Enable = true;return;
在timer1_Tick里写timer1.Enable = false;MessageBox.Show("OK!");这个方法是让DragDrop响应Windows消息后马上返回,以免发送消息的窗体等着MessageBox而不能动,用Timer是使得MessageBox对窗体是模式的,另开线程的话就不是模式的了。
而是DragEnter.和DragDrop事件的原因....
因为是拖放..在响应事件的过程中鼠标在桌面上将一直被程序控件...
private void panel1_DragDrop(object sender, DragEventArgs e)
{
message = "OK";
Thread th = new Thread(new ThreadStart(ShowBox));
th.Start();
}
string message;
public void ShowBox()
{
MessageBox.Show(message);
}
新建一个线程显示提示框可以解决
To另开线程:另开线程弹出的对话框不是模式的。
Tofengqinggao(风清高),MessageBox省略owner默认就是this。