C# clickevent中光标的位置

C# clickevent中光标的位置,c#,winforms,C#,Winforms,我想获取执行单击事件的控件位置 为此,我尝试了以下代码 Xpos = Cursor.Position.X; Ypos = Cursor.Position.Y; MouseEventArgs m = (MouseEventArgs)e; Xpos=m.X; Ypos=m.Y; 但这给出了光标的当前位置。然后我尝试了以下代码 Xpos = Cursor.Position.X; Ypos = Cursor.Position.Y; MouseEventArgs m = (MouseEventArg

我想获取执行单击事件的控件位置

为此,我尝试了以下代码

Xpos = Cursor.Position.X;
Ypos = Cursor.Position.Y;
MouseEventArgs m = (MouseEventArgs)e;
Xpos=m.X;
Ypos=m.Y;
但这给出了光标的当前位置。然后我尝试了以下代码

Xpos = Cursor.Position.X;
Ypos = Cursor.Position.Y;
MouseEventArgs m = (MouseEventArgs)e;
Xpos=m.X;
Ypos=m.Y;
但这个位置并不是相对于整个屏幕

如何获取执行单击事件的控件位置

编辑


作为为重复、、、提供的链接,它提供了执行单击操作的点的位置,、、但不提供执行单击的控制位置。

您能试试吗?它应该返回您期望的结果(单击控件的左上角)

XAML:

<TextBlock Text="Sample" Width="100" Height="50" 
           MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>

如果您的项目位于
windowsformapplication
中,则

如果控件是
按钮
,则与屏幕截图中的类似

然后,您还可以访问其主屏幕和窗体屏幕的位置wrt

下面是代码

private void button1_Click(object sender, EventArgs e)
{
    //This code gives you the location of button1 wrt your primary working screen
    Point location = this.PointToScreen(button1.Location);
    int x1 = location.X;
    int y1 = location.Y;

    MessageBox.Show($"X: {x1}, Y: {y1}");


    //This code gives you the location of button1 wrt your forms upper-left corner        
    Point relativeLoc = new Point(location.X - this.Location.X, location.Y - this.Location.Y);
    int x2 = relativeLoc.X;
    int y2 = relativeLoc.Y;

    MessageBox.Show($"X: {x2}, Y: {y2}");


    //This code gives you the location of button1 wrt your forms client area
    Point relativeLoc1 = new Point(button1.Location.X, button1.Location.Y);
    int x3 = relativeLoc1.X;
    int y3 = relativeLoc1.Y;

    MessageBox.Show($"X: {x3}, Y: {y3}");
}
在上面的代码中,我使用了
this
,您可以根据需要使用任何
表单
对象

编辑:

<TextBlock Text="Sample" Width="100" Height="50" 
           MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
如果您不知道控件将被单击到哪里,那么您必须在表单中为所有控件注册一个事件,如

在下面的代码中,我使用了
MouseHover
事件,但您可以根据需要使用任何事件

首先,为
Form1\u Load
中的所有控件注册
MouseHover
事件

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Control c in this.Controls)
        c.MouseHover += myMouseHoverEvent;
}
然后您的自定义
MouseHover
事件

private void myMouseHoverEvent(object sender, EventArgs e)
{
    Control control = sender as Control;

    int x = control.Location.X;
    int y = control.Location.Y;

    MessageBox.Show($"X: {x}, Y: {y}");
}

再试一次可能会对您有所帮助

如果您让此事件处理程序处理您感兴趣的所有控件的MouseClick事件,则此代码应该可以解决您的问题。 如果要在单击的控件中包含该位置。然后添加鼠标事件参数中包含的位置(代码中的Se注释)


您使用哪个事件获取
MouseEventArgs
?是
WindowsForms
还是
WPF
应用程序?您希望的位置相对于主屏幕还是您的窗口屏幕可能重复?@ershoaib windowscreen@vk2s,请查看答案可能对您有帮助:)这里我们知道按钮1已单击,,,它可以在窗体的任何部分单击…按钮1.位置意味着您需要知道窗体上鼠标悬停的任何控件的位置吗?我想知道执行单击的控件位置、、、以及将在哪个控件中执行单击我不知道VK2S,请查看答案中的“编辑”部分(可能对您有帮助:)只有代码片段可以回答此问题。但提供解释总是受欢迎的,因此表单中有一个按钮,用于关闭表单,并在变量行中抛出执行选项“System.ObjectDisposedException:'无法访问已处置对象。对象名称:'button'。”positionToScreen@vk2s您是否在单击按钮时关闭窗口?在此之前,是
WindowsForms
还是
WPF
应用程序?WindowsForms和yes closing on button点击进入窗口关闭前的位置。如果你能分享你的C代码部分,你会更容易得到正确的答案。