7

只需拖动鼠标就可以很容易地将光标的位置移到表单边界之外,当位置发生变化时,它会向表单发送许多值,形成以下代码行。

MessageBox.Show(Cursor.Position.ToString());

显示鼠标位置的消息框。

但是当用户单击表单边界之外时,我需要获取鼠标位置。不仅仅是鼠标悬停。我使用以下代码行来执行此操作:

private void Form1_Deactivate(object sender, EventArgs e)
{
    MessageBox.Show(Cursor.Position.ToString());
}

我放置了 MessageBox.Show(Cursor.Position.ToString()); 进入表单停用事件。当用户在表单外单击时,肯定会发生此事件。但是当用户不点击外部但使用ALT + TAB组合键更改程序时,它也会发送错误的值。

实际上,我必须从第一次单击的位置开始捕获该区域的屏幕截图。因此,当在表单外单击光标时,我需要光标的位置。像: 在此处输入图像描述

4

5 回答 5

11

这可能对某人有所帮助。

在这里,我使用Windows.Forms.Timer两个文本框来显示 [X 和 Y] 光标位置。在计时器滴答时调用 APIGetCursorPos并获取光标位置。

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern bool GetCursorPos(ref Point lpPoint);

    public Form1()
    {
        InitializeComponent();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        var pt = new Point();

        GetCursorPos(ref pt);
        textBox1.Text = pt.X.ToString();
        textBox2.Text = pt.Y.ToString();
    }   
}

问候,兰吉特。

于 2011-10-04T13:26:50.887 回答
8

您应该使用Global Mouse Hook逻辑来执行此操作。

这是一篇可以帮助您的好文章:Processing Global Mouse and Keyboard Hooks in C#

于 2011-04-03T09:06:11.630 回答
1

这个问题的解决方法很简单。您所需要的只是一个System.Windows.Forms.Timer, 并用于从 user32.dllSystem.Runtime.InteropService.DllImport中外部方法。GetKeyState

该函数有一个任意整数类型的参数,它返回short (Int16)。此功能可以告诉您是否在任何时候和任何地方都按下了某些键,而不取决于表单。启用计时器时,您可以检查鼠标位置是否超出表单边界。获取鼠标位置的方法有很多。

一种方法是Cursor.Position, 或Control.MousePosition, 或者您可以使用 bool GetCursorPos(ref Point lpPoint),一种外部方法,您可以从“user32.dll” DllImport 它。form.Bounds 或 form.ClientRectangle,或 form.Location 和 form.Size 或 form.Left 和 form.Top 和 form.Width 和 form.Height,所有这些都为您带来了表单边界。在 timer_Tick 函数事件中,您编写以下代码,例如:

var mp = Cursor.Position;
var fb = form.ClientRectangle; // Or form.Bounds

if (mp.X < fb.X || mp.Y < fb.Y || mp.X > fb.X + fb.Width || mp.Y > fb.Y + fb.Height)
{
    // Use GetKeyState from user32.dll to detect if at least 1 key is pressed
    // (look at internet how to do it exactly)
    // If yes MessageBox.Show("Clicked outside");
}

如果至少按下了 1 个键,然后使用 显示您的消息MessageBox。你可以在互联网上阅读我之前所说的所有这些东西,如果你成功了,它就会起作用!

于 2013-06-25T08:32:42.230 回答
1

试试这个:

// Form1.cs

private Point pos1;
private Point pos2;

private bool b = true;
private double diffx;
private double diffy;
private double area;

private void Form1_Deactivate(object sender, EventArgs e)
{
    if (b) (pos1, b) = (Cursor.Position, false);
    else
    { 
        pos2 = Cursor.Position;

        if (pos1.x >= pos2.x) diffx = pos1.x - pos2.x;
        else diffx = pos2.x - pos1.x;

        if (pos1.y >= pos2.y) diffy = pos1.y - pos2.y;
        else diffy = pos2.y - pos1.y;

        area = diffx * diffy;

        MessageBox.Show(area.ToString());
    }
}

但是您必须在起点单击程序外部后再次单击程序,然后在终点单击程序外部才能使程序正常工作

于 2016-01-20T11:11:48.480 回答
0

停用事件会通知您的表单它不再处于活动状态。它可能由于许多原因而发生。

通常,只有当鼠标悬停在该窗口上时,Window 才会获取鼠标事件。SetCapture函数可让您获取所有鼠标事件(我不知道 .NET 对应项)。因为只有一个窗口可以捕获鼠标事件,所以您不应该在不需要时捕获鼠标事件。该问题没有足够的详细信息来说明您真正想做的事情以及为什么您需要知道用户何时在表单之外单击。

于 2011-04-03T09:09:19.790 回答