单击窗体边界时获取鼠标光标的位置

只需拖动鼠标就可以很容易地将光标的位置放在窗体的边界之外,当位置发生变化时,它会向窗体发送许多值,形成下面的代码行。
        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组合键更改程序时,它也会发送错误的值。 实际上我必须从第一次点击的位置开始捕捉该区域的屏幕截图。因此,当在表单外部单击时,我需要光标的位置。 喜欢:     
已邀请:
您应该使用
Global Mouse Hook
逻辑来执行此操作。 这是一篇很好的文章,可以帮助您:使用C#处理全局鼠标和键盘挂钩     
这可能对某人有所帮助。 这里我使用
Windows.Forms.Timer
和两个文本框来显示[X和Y]光标位置。在计时器滴答调用API
GetCursorPos
并获得光标位置。
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)
    {
         Point pt = new Point();
        GetCursorPos(ref pt);
        textBox1.Text = pt.X.ToString();
        textBox2.Text = pt.Y.ToString();
    }


}
问候, 兰吉特。     
这个问题的解决方案很简单。所有你需要的是一个System.Windows.Forms.Timer,并使用System.Runtime.InteropService中的DllImport来从user32.dll中取出方法GetKeyState。此函数具有任何类型整数的一个参数,并返回short(Int16)。此功能可以告诉您是否在每个时刻和任何地方按下了某些键,而不是取决于表单。当Timer启用时,您可以检查鼠标位置是否超出表单范围。有很多方法可以获得鼠标位置。一种方法是Cursor.Position,或Control.MousePosition,或者你可以使用bool GetCursorPos(ref Point lpPoint),一个extern方法,你可以从“user32.dll”DllImport它。 form.Bounds或form.ClientRectangle,或form.Location和form.Size或form.Left和form.Top和form.Width and form.Height,所有这些都为您带来了表单边界。在timer_Tick函数事件中,您编写以下代码,例如: {
   Point mp = Cursor.Position;
   Rectangle 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显示您的消息。你可以在互联网上阅读如何做我之前谈论的所有这些东西,如果你成功了,它会起作用!     
计算区域而不是键入此代码
private void Form1_Deactivate(object sender, EventArgs e)
{
    MessageBox.Show(Cursor.Position.ToString());
}
首先创建一个名为的变量
Point pos1;
和另一个名为的变量
Point pos2;
和一个名为的布尔变量
Boolean b = true;
和两个双人命名
double diffx;
double diffy;
和一个名为的区域的双倍
double area;
所有变量都将在Form1类中 然后在Form1_Deactivate中进行此操作
private void Form1_Deactivate(object sender, EventArgs e)
{
    if(b)
    {
         pos1 = Cursor.Position;
         b = 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;
        //now display it in the message box by this:
        MessageBox.Show(area.ToString());
    }
}
但是有一个问题是你必须在开始点点击它之后再点击该程序然后在结束点点击它以使程序工作     
停用事件会通知您的表单已不再处于活动状态。它可能因为许多原因而发生。 通常只有当鼠标悬停在此窗口上时,窗口才会获取鼠标事件。 SetCapture函数可以让你抓住所有鼠标事件(我不知道.NET对应物)。因为只有一个窗口可以捕获鼠标事件,所以不应该在不需要时捕获鼠标事件。问题没有足够详细说明您真正想做什么以及为何需要知道用户何时在表单外单击。     

要回复问题请先登录注册