日期:2014-05-18  浏览次数:21383 次

C#根据鼠标位置获取控件名称
开发环境:C# 2008 WinFrom
在一个窗体上放置了若干个Panel控件,每个Panel控件中又放置axShockwaveFlash控件(播放flash的控件)
需要实现的目标:
用户从IE或其他浏览器里面拖动flash到axShockwaveFlash控件上,则这个axShockwaveFlash播放拖过来的flash。
问题:
  因为axShockwaveFlash是没有DragDrop事件和DragEnter事件的,因此我需要判断拖过来后鼠标松开是当前鼠标所在控件的名称,即根据当前point获取控件的名称,请问我该如何做?谢谢!

------解决方案--------------------
沙發,不太懂,幫忙頂下。高手解答。。
------解决方案--------------------
试着提出一种比较笨的方法。
使用Form来捕捉鼠标事件,可以获得鼠标在Form上的具体坐标,然后遍历所有axShockwaveFlash控件获取矩形轮廓,判断鼠标坐标是否落在矩形中。
------解决方案--------------------
C# code

        private void frmACTest_Load(object sender, EventArgs e)
        {
            this.capture = true;//使用窗口捕捉鼠标移动时间
        }

        private void frmACTest_MouseMove(object sender, MouseEventArgs e)
        {
            Point point = this.PointToScreen(new Point(e.X,e.Y));
            Rectangle rc =  this.button1.RectangleToScreen(this.button1.ClientRectangle);
            if (rc.Contains(point)) MessageBox.Show("button1 被经过了");
        }

------解决方案--------------------
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
this.textBox1.Text = e.X.ToString() + ":" + e.Y.ToString();
}

private void panel4_MouseEnter(object sender, EventArgs e)
{
this.Capture = true;

Panel p = sender as Panel;

this.textBox1.Text = this.textBox1.Text + ":" + p.Name;
}

private void Form1_MouseLeave(object sender, EventArgs e)
{
this.Capture = false;
}

我测试下,没有问题。我用4个panel平分了窗体。
------解决方案--------------------
探讨
谢谢3000sunqin,但我还是想根据point的位置获取控件名称。

------解决方案--------------------
学到不少,没白逛
------解决方案--------------------
每天回帖即可获得10分可用分
------解决方案--------------------
鼠标移动的事件属于某个控件, 你写的代码也跟那个控件有关
如果鼠标移出那个控件怎么办, 需要 grab 住鼠标, 使得鼠标移动到外面, 控件仍旧能接收到鼠标消息

随后你就跟踪鼠标移动事件,
在移动中:

// 得到窗口句柄
POINT windowPoint = POINT.FromPoint(this.PointToScreen(new Point(e.X, e.Y)));
IntPtr hwnd = NativeUtils.WindowFromPoint(windowPoint);

if (hwnd != IntPtr.Zero) {
// 如果是托管的, 就能得到对应的 control 类对象
// 不是所有 hwnd 都是托管的哦
Control c = Control.FromHandle(hwnd);
}

[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(POINT Point);

------解决方案--------------------
鼠标移动的事件属于某个控件, 你写的代码也跟那个控件有关
如果鼠标移出那个控件怎么办, 需要 grab 住鼠标, 使得鼠标移动到外面, 控件仍旧能接收到鼠标消息

随后你就跟踪鼠标移动事件,
在移动中:

// 得到窗口句柄
POINT windowPoint = POINT.FromPoint(this.PointToScreen(new Point(e.X, e.Y)));
IntPtr hwnd = NativeUtils.WindowFromPoint(windowPoint);

if (hwnd != IntPtr.Zero) {
// 如果是托管的, 就能得到对应的 control 类对象
// 不是所有 hwnd 都是托管的哦
Control c = Control.FromHandle(hwnd);
}

[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(POINT Point);

------解决方案--------------------
给你一个完整的示例:
/**********************
 * 课题:将窗体中鼠标所在控件名显示在窗体标题上
 * 作者:ZAXX
 * QQ : 94027486
 * 本课题可简单扩展:获取屏幕上鼠标所在位置的窗口句柄与类名
 **********************/