C#根据鼠标位置获取控件名称

yyj135 2010-09-26 03:32:19
开发环境:C# 2008 WinFrom
在一个窗体上放置了若干个Panel控件,每个Panel控件中又放置axShockwaveFlash控件(播放flash的控件)
需要实现的目标:
用户从IE或其他浏览器里面拖动flash到axShockwaveFlash控件上,则这个axShockwaveFlash播放拖过来的flash。
问题:
因为axShockwaveFlash是没有DragDrop事件和DragEnter事件的,因此我需要判断拖过来后鼠标松开是当前鼠标所在控件的名称,即根据当前point获取控件的名称,请问我该如何做?谢谢!
...全文
1786 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxyc521y 2011-10-27
  • 打赏
  • 举报
回复
强!顶。收获很大啊
Yhzhtk 2011-07-08
  • 打赏
  • 举报
回复
学习了
yangquanlaohou 2010-09-27
  • 打赏
  • 举报
回复
学到不少,没白逛
lbcleo 2010-09-27
  • 打赏
  • 举报
回复
帮顶下,希望上面答案满意
liuqilin1987 2010-09-27
  • 打赏
  • 举报
回复
给你的思想吧,通过托管函数来实现
private void Panel_MouseClick(object sender, EventArgs e)
{
Panel pa;
if (sender is Panel )//使用托管来实现双击
{
pa= (Panel)sender;
//你需要做的事情
if(e.x>=1&&e.x<=3&&e.y>=1&&e.y<=3)
{
//当前为panel1,进行你要处理的事件
}
}
}
liuqilin1987 2010-09-27
  • 打赏
  • 举报
回复
给你的思想吧,通过托管函数来实现
private void Panel_MouseClick(object sender, EventArgs e)
{
Panel pa;
if (sender is Panel )//使用托管来实现双击
{
Pic= (Panel)sender;
//你需要做的事情
if(e.x>=1&&e.x<=3&&e.y>=1&&e.y&&3)
{
//当前为panel1,进行你要处理的事件
}
}
}
yyj135 2010-09-27
  • 打赏
  • 举报
回复
To:yareyou
我发现webBrowser控件不行,不知道什么原因。
javacode007 2010-09-26
  • 打赏
  • 举报
回复
学习了。。。
yyj135 2010-09-26
  • 打赏
  • 举报
回复
谢谢yareyou,明天我到公司试试。
messi_yang 2010-09-26
  • 打赏
  • 举报
回复
帮你顶了·····
zaxx 2010-09-26
  • 打赏
  • 举报
回复
给你一个完整的示例:
/**********************
* 课题:将窗体中鼠标所在控件名显示在窗体标题上
* 作者:ZAXX
* QQ : 94027486
* 本课题可简单扩展:获取屏幕上鼠标所在位置的窗口句柄与类名
**********************/
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Zaxx
{
public partial class MouseOnControl: Form
{
[DllImport("User32.dll")]
private static extern IntPtr WindowFromPoint(Point p);

Timer timer;

public MouseOnControl()
{
InitializeComponent();
timer = new Timer();
timer.Interval = 200;
timer.Enabled = true;
timer.Tick += new EventHandler(timer_Tick);
}

void timer_Tick(object sender, EventArgs e)
{
Point p = Cursor.Position;
IntPtr h = WindowFromPoint(p);
foreach (Control con in this.Controls)
if (con.Handle == h)
this.Text = con.Name;
}
}
}
你自己向MouseOnControl窗体里添加几个控件,运行就可以看到结果了。而你若只想判断是否在你那个axShockwaveFlash控件上,就只用一个if语句,而不用foreach循环就足够了。
mars199 2010-09-26
  • 打赏
  • 举报
回复
鼠标移动的事件属于某个控件, 你写的代码也跟那个控件有关
如果鼠标移出那个控件怎么办, 需要 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);
Dobzhansky 2010-09-26
  • 打赏
  • 举报
回复
鼠标移动的事件属于某个控件, 你写的代码也跟那个控件有关
如果鼠标移出那个控件怎么办, 需要 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);
yyj135 2010-09-26
  • 打赏
  • 举报
回复
TO:dattotzy
谢谢!
这样是可以了,不过还有一个问题,例如有些控件没有MouseEnter事件,这样我就不知道如何获取了。
myhuli120 2010-09-26
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
zhaohuakun 2010-09-26
  • 打赏
  • 举报
回复
学到不少,没白逛
ztenv 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yyj135 的回复:]
谢谢3000sunqin,但我还是想根据point的位置获取控件名称。
[/Quote]
别钻牛角尖,实现了就可以;
酋长 2010-09-26
  • 打赏
  • 举报
回复
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平分了窗体。
yyj135 2010-09-26
  • 打赏
  • 举报
回复
谢谢3000sunqin,但我还是想根据point的位置获取控件名称。
3000sunqin 2010-09-26
  • 打赏
  • 举报
回复

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 被经过了");
}

你说的那个控件我没有使用过,我用了一个Button来代替;
还有一个办法,做一个自定义控件,在该控件中放置axShockwaveFlash控件,然后将鼠标事件都捕捉到该自定义控件上,就相当于axShockwaveFlash控件具有了DragEnter等方法了。
加载更多回复(4)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧