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

yyj135 2010-09-26 03:32:19
开发环境:C# 2008 WinFrom
在一个窗体上放置了若干个Panel控件,每个Panel控件中又放置axShockwaveFlash控件(播放flash的控件)
需要实现的目标:
用户从IE或其他浏览器里面拖动flash到axShockwaveFlash控件上,则这个axShockwaveFlash播放拖过来的flash。
问题:
因为axShockwaveFlash是没有DragDrop事件和DragEnter事件的,因此我需要判断拖过来后鼠标松开是当前鼠标所在控件的名称,即根据当前point获取控件的名称,请问我该如何做?谢谢!
...全文
1663 26 打赏 收藏 转发到动态 举报
写回复
用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)
C#控件大全 、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 (2) WindowState属性: 用来获取或设置窗体的窗口状态。 取值有三种: Normal (窗体正常显示)、 Minimized (窗体以最小化形式显示)和 Maximized(窗体以最大化形式显示)。 (3)StartPosition属性:用来获取或设置运行时窗体的起始位置。 (4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字。 (5)Width属性:用来获取或设置窗体的宽度。 (6)Height属性:用来获取或设置窗体的高度。 (7)Left属性:用来获取或设置窗体的左边缘的x坐标(以像素为单位)。 (8)Top属性:用来获取或设置窗体的上边缘的y坐标(以像素为单位)。 (9)ControlBox属性:用来获取或设置一个值,该值指示在该窗体的标题栏中是否显示控制框。值为true 时将显示控制框,值为false时不显示控制框。 (10)MaximizeBox属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最大化按钮。值 为 true时显示最大化按钮,值为false时不显示最大化按钮。 (11)MinimizeBox 属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最小化按钮。值 为 true时显示最小化按钮,值为false时不显示最小化按钮。 (12)AcceptButton 属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按 Enter 键时就相 当于单击了窗体上的该按钮。 (13)CancelButton 属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按 Esc 键时就相当 于单击了窗体上的该按钮。 (14)Modal 属性:该属性用来设置窗体是否为有模式显示窗体。如果有模式地显示该窗体,该属性值为 true;否则为 false。当有模式地显示窗体时,只能对模式窗体上的对象进行输入。必须隐藏或关闭模式窗 体(通常是响应某个用户操作),然后才能对另一窗体进行输入。有模式显示的窗体通常用做应用程序中 的对话框。 (15)ActiveControl属性:用来获取或设置容器控件中的活动控件。窗体也是一种容器控件。 (16)ActiveMdiChild属性:用来获取多文档界面(MDI)的当前活动子窗口。 (17)AutoScroll 属性:用来获取或设置一个值,该值指示窗体是否实现自动滚动。如果此属性值设置为 true,则当任何控件位于窗体工作区之外时,会在该窗体上显示滚动条。另外,当自动滚动打开时,窗体 的工作区自动滚动,以使具有输入焦点的控件可见。 (18)BackColor属性:用来获取或设置窗体的背景色。 (19)BackgroundImage属性:用来获取或设置窗体的背景图像。 (20)Enabled 属性:用来获取或设置一个值,该值指示控件是否可以对用户交互作出响应。如果控件可 以对用户交互作出响应,则为 true;否则为false。默认值为true。 (21)Font属性:用来获取或设置控件显示的文本的字体。 (22)ForeColor属性:用来获取或设置控件的前景色。 (23)IsMdiChild属性:获取一个值,该值指示该窗体是否为多文档界面(MDI)子窗体。值为 true时, 是子窗体,值为false时,不是子窗体。 (24)IsMdiContainer 属性:获取或设置一个值,该值指示窗体是否为多文档界面(MDI)中的子窗体的 容器。值为true时,是子窗体的容器,值为false时,不是子窗体的容器。 (25)KeyPreview属性:用来获取或设置一个值,该值指示在将按键事件传递到具有焦点的控件前,窗体 是否将接收该事件。值为true时,窗体将接收按键事件,值为false时,窗体不接收按键事件。 (26)MdiChildren属性:数组属性。数组中的每个元素表示以此窗体作为父级的多文档界面(MDI)子窗 体。 (27)MdiParent属性:用来获取或设置此窗体的当前多文档界面(MDI)父窗体。 (28)ShowInTaskbar属性:用来获取或设置一个值,该值指示是否在Windows任务栏中显示窗体。 (29)Visible属性:用于获取或设置一个值,该值指示是否显示该窗体或控件。值为true 时显示窗体或控件,为 false时不显示。 (30)Capture属性:如果该属性值为true,则鼠标就会被限定只由此控件响应,不管鼠标是否在此控件的 范围内。 2、常用方法 下面介绍一些窗体的最常用方法。 (1)Show方法:该方法的作用是让窗体显示出来,其调用格式为: 窗体名.Show(); 其中窗体名是要显示的窗体名称。 (2)Hide方法:该方法的作用是把窗体隐藏出来,其调用格式为: 窗体名.Hide(); 其中窗体名是要隐藏的窗体名称。 (3)Refresh方法:该方法的作用是刷新并重画窗体,其调用格式为: 窗体名.Refresh(); 其中窗体名是要刷新的窗体名称。 (4)Activate方法:该方法的作用是激活窗体并给予它焦点。其调用格式为: 窗体名.Activate(); 其中窗体名是要激活的窗体名称。 (5)Close方法:该方法的作用是关闭窗体。其调用格式为: 窗体名.Close(); 其中窗体名是要关闭的窗体名称。 (6)ShowDialog方法:该方法的作用是将窗体显示为模式对话框。其调用格式为: 窗体名.ShowDialog(); 3.常用事件 (1)Load事件:该事件在窗体加载到内存时发生,即在第一次显示窗体前发生。 (2)Activated事件:该事件在窗体激活时发生。 (3)Deactivate事件:该事件在窗体失去焦点成为不活动窗体时发生。 (4)Resize事件:该事件在改变窗体大小时发生。 (5)Paint事件:该事件在重绘窗体时发生。 (6)Click事件:该事件在用户单击窗体时发生。 (7)DoubleClick事件:该事件在用户双击窗体时发生。 (8)Closed事件:该事件在关闭窗体时发生。 文本框类控件 2、Label 控件 1、常用属性: (1)Text属性:用来设置或返回标签控件中显示的文本信息。 (2)AutoSize 属性:用来获取或设置一个值,该值指示是否自动调整控件的大小以完整显示其内容。取 值为 true时,控件将自动调整到刚好能容纳文本时的大小,取值为false时,控件的大小为设计时的大小。 默认值为false。 (3)Anchor 属性:用来确定此控件与其容器控件的固定关系的。所谓容器控件指的是这样一种情况:往 往在控件之中还有一个控件,例如最典型的就是窗体控件中会包含很多的控件,像标签控件、文本框等。 这时称包含控件控件为容器控件或父控件,而父控件称为子控件。这时将遇到一个问题,即子控件与父 控件位置关系问题,即当父控件位置、大小变化时,子控件按照 什么样的原则改变其位置、大小。Anchor属性就规定了这个原则。 对于 Anchor 属性,可以设定 Top、Bottom、Right、Left 中的任意几 种,设置的方法是在属性窗口中单击Anchor属性右边的箭头,将会 出现如图 9-6 的窗口,通过它可设置 Anchor 属性值。图 9-6 中选中 变黑的方位即为设定的方位控制,即图中所示的为 Left、Right、 Bottom。此时,如果父窗口变化,子窗口将保证其左边缘与容器左边 的距离、上边缘与容器上边的距离、底边与容器底边的距离等不变, 效果如图9-7 所示。
第15章 键盘与鼠标 389 15.1 鼠标操作技巧 390 0626 鼠标双击窗体时模拟键盘Tab键操作 390 0627 定义鼠标指针形状 390 0628 自定义鼠标的图片 391 0629 鼠标拖放复制文本 391 0630 如何使用鼠标单击添加控件 392 0631 如何获得鼠标在窗体上的位置 392 0632 如何交换鼠标左右键功能 392 0633 如何隐藏和显示鼠标 393 0634 如何获取光标闪烁的频率 394 0635 如何获得屏幕上鼠标的坐标 394 0636 如何限制鼠标在某一区域工作 394 0637 如何利用鼠标绘图 395 0638 如何获取鼠标双击时间间隔 396 0639 如何获取鼠标键数 396 0640 如何显示鼠标的等待光标 397 0641 如何禁用鼠标左键 397 0642 如何模拟鼠标操作 398 0643 如何实现鼠标穿透窗体 399 0644 如何记录鼠标行为 399 15.2 键盘操作技巧应用 400 0645 如何禁用输入法编辑器 400 0646 如何打开和关闭输入法编辑器 400 0647 回车转换成Tab键 400 0648 如何获取组合键 401 0649 如何获取功能键 401 0650 如何判断NumLock键和CapsLock键是否锁定 401 0651 如何屏蔽 Alt + F4 键关闭窗体 402 0652 如何实现按下 Esc 键关闭窗体 402 0653 如何避免按 Enter 键产生“嘀”声 403 0654 如何设置键盘热键 403 第16章 文件、文件管理及数据流 405 16.1 获取文件基本信息 406 0655 获取文件创建的日期和时间 406 0656 如何检索路径中的文件名和扩展名 406 0657 如何获得文件的大小 407 0658 如何修改文件属性 407 0659 如何监视文件系统变化情况 408 0660 如何获取文件的系统启动方式 408 0661 如何获取文件名禁止使用的字符 409 0662 如何获取路径名禁止使用的字符 410 0663 如何获取指定目录的上级目录 410 16.2 文件基本操作 411 0664 判断文件是否存在 411 0665 创建一个文件用于写入UTF-8编码的文本 411 0666 OpenRead方法打开现有文件并读取 412 0667 打开现有UTF-8编码文本文件并进行读取 412 0668 OpenWrite方法打开现有文件并进行写入 413 0669 如何读取文件中的第一行数据 413 0670 如何向文件中写入数据 413 0671 如何读取文件中所有数据 414 0672 如何创建临时文件 414 0673 如何实现文件替换 415 0674 使用递归法删除文件夹中所有文件 415 0675 如何更改文件扩展名 416 0676 如何实现复制文件 416 0677 如何修改文件名 416 0678 如何删除文件 417 0679 如何上传文件 417 0680 如何下载文件 418 0681 如何拖放文件 419 0682 如何搜索文件 419 16.3 文件夹基本操作 420 0683 如何创建文件夹 420 0684 如何移动文件夹 420 0685 如何修改文件夹名称 421 0686 如何遍历文件夹 421 0687 如何删除文件夹 422 16.4 数据流操作 422 0688 如何读写内存数据流 422 0689 如何创建二进制文件 423 0690 如何读取二进制文件 423 0691 如何使用缓冲流 424 16.5 加密、解密及解压缩文件 425 0692 加密和解密文件 425 0693 如何使用对称算法加密文件 425 0694 如何使用对称算法解密文件 426 0695 如何使用GZip压缩文件 427 0696 如何使用GZip解压文件 428 0697 如何使用WinRAR压缩文件 429 0698 如何使用WinRAR解压文件 429 16.6 其他 430 0699 设置文件的访问模式 430 0700 如何在C#应用程序中使用INI文件 430 0701 如何操作帮助文件 431 0702 如何操作Word文件 432 0703 如何操作Excel文件 433 0704 如何将文本文件转换成网页文件 434 0705 如何产生随机文件夹名或文件名 435 0706 如何将长文件名转换成短文件名 436 0707 如何用程序创建XML文档并写入内容 436 0708 如何通过DataSet对象读取XML文件 438 0709 如何动态创建XML文件节点 439 0710 如何实现XML文件数据类型的转换 439 0711 将图片保存到XML文件中 440 0712 如何比较两个文件的内容是否相同 440 0713 如何以缩略图形式上传图片文件 441 0714 如何解析只有一种格式的文本文件 442 0715 如何解析含有多种格式的文本文件 443 第17章 Windows开发技术 445 17.1 获取计算机系统信息 446 0716 如何获取系统时间 446 0717 如何获取系统目录 446 0718 如何获取计算机名称 446 0719 如何获取当前程序运行目录 446 0720 如何获得操作系统版本号 446 17.2 获取计算机硬件信息 446 0721 如何获取CPU编号 446 0722 如何获取显示设备的PNPDeviceID 447 0723 如何获取声音设备的PNPDeviceID 447 0724 如何获取硬盘编号 447 0725 如何获取CPU的版本信息 448 0726 如何获取CPU的产品名称信息 448 0727 如何获取CPU的制造商名称 448 0728 如何获取主板制造商 449 0729 如何获取主板编号 449 0730 如何获取主板型号 449 0731 如何获取磁盘空间 450 0732 如何获取磁盘剩余空间 450 0733 如何确定屏幕的分辨率 451 0734 如何获得磁盘的卷标 452 0735 如何获得磁盘的文件系统类型 452 17.3 获取特殊文件夹路径 453 0736 如何获取ProgramFiles目录全路径 453 0737 如何获取桌面目录全路径 453 0738 如何获取开始菜单目录全路径 454 0739 如何获取用户程序组目录全路径 454 0740 如何获取文档模板目录全路径 455 0741 如何获取收藏夹目录全路径 455 0742 如何获取共享组件目录全路径 456 0743 如何获取我的图片目录全路径 456 0744 如何获取Internet历史记录全路径 457 0745 如何获取Internet临时文件目录全路径 457 0746 如何设置可用样式 457 17.4 获得Windows当前用户 458 0747 如何获取当前用户 458 0748 如何判断当前用户是否是普通用户 458 0749 如何判断当前用户是否是超级用户 458 0750 如何判断当前用户是否是系统管理员 459 0751 如何判断当前用户是否是系统操作员 459 0752 如何判断当前用户是否是备份操作员 460 0753 如何判断当前用户是否是打印操作员 460 0754 如何判断当前用户是否是复制程序员 461 0755 如何判断当前用户是否是账户操作员 461 17.5 Windows日志 462 0756 如何获取系统日志信息 462 0757 如何获取安全日志信息 462 0758 如何获取应用程序日志信息 463 0759 如何创建并写入自定义日志信息 464 0760 如何向系统日志写入自定义数据 464 0761 如何向应用程序日志写入自定义信息 465 17.6 计算机控制 465 0762 列举系统中所有窗口 465 0763 C#实现键盘钩子 465 0764 如何关闭计算机 466 0765 如何抓屏 466 0766 如何休眠计算机 467 0767 如何禁止使用Windows任务管理器 468 0768 如何为文件新增右键菜单项 468 0769 如何设置系统仅能运行的程序 469 0770 如何获取本地计算机上所有的进程 469 0771 如何启动一个进程 470 0772 怎样杀死一个进程 470 0773 如何获取远程计算机上所有的进程 470 17.7 其他相关技术 470 0774 如何在注册表中保存窗体的大小和位置 470 0775 如何实现程序间注册表内传递变量 471 0776 在使用OpenFileDialog中的相对路径问题 471 0777 如何设置启动时自动执行程序 471 0778 C#编程实现Windows XP风格的界面 471 0779 用C#实现文件查找功能 473 0780 如何序列化对象 473 0781 如何实现特殊形状的窗体 474 0782 如何移动正在使用的文件 474 0783 如何实现类似QQ的程序界面 475 0784 如何实现动画显示窗体 476 0785 如何显示和隐藏任务栏 477 0786 如何实现OutLook界面 478 0787 如何在C#中回车换行 478 0788 如何获取进程的命令行 479 0789 如何按行读取文本并显示行数 479 0790 如何在Form中嵌入Excel 479 0791 如何使用互斥量禁止程序运行两个实例 480 0792 如何使用进程名禁止程序运行两个实例 480 0793 如何获取控制台应用程序的显示结果 481 0794 如何用@代替路径中的转义字符 482

110,538

社区成员

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

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

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