.NET中,使用c# 编的,我怎样在form上获取鼠标位置,下面这个加进去,没反应。还有能在Picturebox中获取鼠标坐标吗private void Form1_MouseMove(object sender, MouseEventArgs e)
{
label1 .Text ="x坐标:"+e.X.ToString () ;
label2.Text = "y坐标:" + e.Y.ToString(); }

解决方案 »

  1.   

    设置窗体KeyPreview属性为true试试
      

  2.   

    这个不行,实在 不行就用MouseHook吧:http://blog.csdn.net/sohighthesky/archive/2009/04/15/4074757.aspx
      

  3.   

    Hook尽量少用,影响效率的。楼主你那个情况应该是在Form中放置了其它控件,比如panel控件,鼠标一旦移动到其它控件上,就不会触发你的Form1上的鼠标事件了,给其它空间捕获过去了。有个办法可以很方便的解决这个问题,假如你鼠标可能移动到panel1上面,那么给panel1添加如下事件(panel1_MouseEnter)即可,另外记得给Form1添加鼠标移出事件(Form1_MouseLeave):        private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                label1 .Text ="x坐标:" + e.X.ToString () ; 
                label2.Text = "y坐标:" + e.Y.ToString();         }        private void panel1_MouseEnter(object sender, EventArgs e)
            {
                this.Capture = true;
            }        private void Form1_MouseLeave(object sender, EventArgs e)
            {
                this.Capture = false;
            }
      

  4.   

    Point p = Cursor.Position; 
    int x = p.X; 
    int y = p.Y; 
    label1.Text = String.Format("Mouse X:{0}, Mouse Y :{1}", x, y); 

    [DllImport("user32.dll")]        
    public static extern bool GetCursorPos(out Point pt); Point CursorPosition;    GetCursorPos(out CursorPosition);    
    label1.Text = "X: " + CursorPosition.X.ToString() + " Y: " +  CursorPosition.Y.ToString();
    private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                Point p= = new Point(e.X, e.Y);
                txtStartX.Text = p.X.ToString();
                txtStartY.Text = p.Y.ToString();
            }
      

  5.   

    你们说的,我都没有实现,可能我说的不清楚,我在form上添加了一个pictureBoxShow,启动时它可以显示USB摄像头视频,这个已经实现了,我现在想做的事,就是当我鼠标移动到这个pictureBoxShow上时,点击一下,在旁边的textbox中能显示鼠标的坐标,就是这样
      

  6.   

    Control.MousePostion
    在任何地方使用都是返回当前鼠标的point
      

  7.   

    你还不如直接给pictureBoxShow添加鼠标事件更方便。如果它不支持鼠标事件,那么只有考虑使用钩子来做了。
      

  8.   

    你用得着重复那个吗?你有没有看楼主#5楼说的情况啊?
    他那个是PictureBoxShow控件,显示是个WIN32控件,那种控件多数不支持鼠标事件的,所以他才用Form上的鼠标事件。现在是事件捕获的问题,而不是鼠标位置的获取问题。都不能响应鼠标点击事件的话,如何显示鼠标坐标?
      

  9.   

    按照qldsrx说的,就没有办法在PictureBoxShow上获取鼠标坐标吗?
    如果实在不行,那我就在上面生成一个form,但是怎样让两个form的右边和上边对齐呢,急救!!!
      

  10.   

    那就再试试过滤消息... form1:form,IMessageFilter
    {
      public form1()
      {
        Application.AddMessageFilter(this); 
      }
      bool PreFilterMessage(ref System.Windows.Forms.Message m)  
      { 
        int WM_MOUSEMOVE=0x0200;    if (m.msg==WM_MOUSEMOVE)
        {
            int X = lparam 低位
             int Y = lparam 高位
         }
         return false;
      }
      

  11.   

    这是什么,能PictureBoxShow上获取鼠标坐标吗?我想到了一个办法,现在要解决的是
    一个是Form1还有一个是Form3, 我在Form1添加一个按钮,按下按钮启动了Form3,但是我怎样让他们右边和上边对齐呢,高度又一样,也就是完全覆盖在上面,一样大,还有在Form3点击鼠标,在Form1上显示鼠标坐标
      

  12.   

    设置窗体KeyPreview属性为true试试
      

  13.   

    把KeyPreview属性设置为true试试,开启键盘功能
      

  14.   

    把KeyPreview属性设置为true试试,这方法还是不行啊?
    怎么办啊,大侠们,出点点子吧
      

  15.   

    keypreview是用于键盘事件的,鼠标当然不行
      

  16.   

    那我怎样在两个Form上传递textbox的text内容呢
      

  17.   

    PictureBoxShow是一个类型还是一个名字为PictureBoxShow的PictureBox?
      

  18.   

    PictureBoxShow是一个PictureBox的名字为
    那我怎样在两个Form上传递textbox的text内容呢
      

  19.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication8
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
               
               
                label1.Text=e.X.ToString();
                    label2.Text = e.Y.ToString();
            }        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                textBox1.Text = e.X.ToString();
                textBox2.Text = e.Y.ToString();
            }
        }
    }
      

  20.   

    那不是很简单嘛,直接处理pictureBox上的鼠标事件就可以了//参考
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                label1.Text = e.Location.ToString();
            }
      

  21.   

    设我们需要点击主窗体FMMain中的某一个按钮时打开子窗体FMChild并将某一个值传给子窗体FMChild,一般情况下,我们点击按钮显示子窗体FMChild的代码为: 
    FMChild fmChild = new FMChild();
    fmChild.ShowDialog();
    fmChild.Dispose(); 
    如果我们需要将主窗体FMMain中的string strValueA的值传给FMChild,那么我们首先对strValueA进行如下处理:private string strValueA;
    public string StrValueA
    {
    get

    return strValueA; 

    set 

    strValueA = value; 
    }

    使其成为主窗体FMMain的一个属性,接着修改显示子窗体的代码为以下两种的其中一种。方法一:FMChild fmChild = new FMChild();
    fmChild.ShowDialog(this);
    fmChild.Dispose(); 
    方法二:FMChild fmChild = new FMChild();
    FMChild.Owner = this;
    fmChild.ShowDialog();
    fmChild.Dispose(); 
    然后在修改子窗体FMChild中申明一个主窗体FMMain对象,FMMain fmMain; 
    在需要使用主窗体FMMain的string strValueA的地方加上如下代码:fmMain = (FMMain)this.Owner; 
    这样,就可以获得主窗体FMMain中strValueA的值了。这时,如果你需要将子窗体FMChild中的string strValueB传给主窗体FMMain,同样处理string strValueB。private string strValueB;
    public string StrValueB

    get { return strValueB; }
    set { strValueB = value; }

    那么你在关闭子窗体代码fmChild.Dispose();后,可以写一些代码来保存或者处理FMChild的strValueB,例如:string strTmp = fmChild.StrValueB; 
    注意,在Visual C#智能设备Pocket PC 2003设备应用程序中显示子窗体FMChild只能使用:FMChild fmChild = new FMChild();FMChild.Owner = this;fmChild.ShowDialog();fmChild.Dispose(); 
    在Visual C#智能设备Pocket PC 2003的设备应用程序中ShowDialog()没有重载。C#窗体间传值的几种方法
    调用窗体(父):Form1,被调用窗体(子):Form2
    方法1: 所有权法
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    //在调用Form2时,要把Form2的所有者设为Form1
    Form2 f2 = new Form2() ;
    f2.Owner = this;
    f2.ShowDialog() ;
    //Form2:
    //在需要对其调用者(父)刷新时
    Form1 f1 ;
    f1 = (Form1)this.Owner;
    f1.Refresh_Method() ;
    方法2:自身传递法
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    Form2 f2 = new Form2() ;
    f2.ShowDialog(this) ;
    //Form2:
    private Form1 p_f1;
    public Form2(Form1 f1)
    {
    InitializeComponent();
    p_f1 = f1;
    }
    //刷新时
    p_f1.Refresh_Method() ;
    方法3:属性法
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    //调用时
    Form2 f2 = new Form2() ;
    f2.P_F1 = this;
    f2.Show() ;//Form2:
    private Form1 p_f1;
    public Form1 P_F1
    {
    get{return p_f1;}
    set{p_f1 = value;}
    }
    //刷新时
    p_f1.Refresh_Method() ;
    方法4:委托法
    //声明一个委托
    public delegate void DisplayUpdate();
    //Form1:
    //需要有一个公共的刷新方法
    public void Refresh_Method()
    {
    //...
    }
    //调用时
    Form2 f2 = new Form2() ;
    f2.ShowUpdate += new DisplayUpdate(Refresh_Method) ;
    f2.Show() ;
    //Form2:
    //声明事件
    public event DisplayUpdate ShowUpdate;
    //刷新时,放在需要执行刷新的事件里
    ShowUpdate();
    Form1中放一个Label1,一个Button1,Form1为主窗口,当点击Button1时,执行:
    Form2 f2 = new Form2();
    f2.ShowDialog(this);Form2中放一个TextBox1,一个Button1,当点击Button1时执行:Form1 f1 = (Form1)this.Owner;
    f1.Label1.Text = this.TextBox1.Text;注意:Form1中的label1要设为public用C#实现两个WinForm间的传值这个题目我曾经出给来公司面试的人,也曾经出给刚毕业的大学生,几乎是没有人会做啊。难道这个问题真的这么难么?现在我给出实现的主要源代码(开发平台为VC#2005)。实现的思路:
         从Form1传递到Form2: 2个窗体即两个类,两个窗体间的数据传送,可以采用构造函数来实现。     从Form2返回到Form1,并传递数据:实例化Form2后,打f2用ShowDialog()方法,然后等待f2关闭时再回传数据到Form1。实现步骤及代码:      1:新建两个窗口: Form1,Form2;
          2:打开Form2,添加一个textBox:textBox1;添加一个Button:button1;然后添加一个构造函数:
            //定义一个变量,用来传值。
            public string returnValue ;        public Form2(string txtValue)
            {
                InitializeComponent();            this.textBox1.Text = txtValue;
            }
    然后在button1的单击事件中添加如下代码:
            private void button1_Click(object sender, EventArgs e)
            {
                returnValue = this.textBox1.Text;
                this.Close();
            }      3:Form1中添加一个textBox:textBox1;添加一个Button:button1;然后在button1的单击事件中添加如下代码:
            private void button1_Click(object sender, EventArgs e)
            {
                string txtValue = this.textBox1.Text;
                Form2 f2 = new Form2(txtValue);
                f2.ShowDialog();
                this.textBox1.Text = f2.returnValue;
            }
    Form1 中 (父窗口:) 
    public class Form1 : System.Windows.Forms.Form
    {
          private System.Windows.Forms.Button btnOpen;
          public System.Windows.Forms.TextBox txtContent; //注意是public       ........       ........      [STAThread]
         static void Main()
         {
              Application.Run(new Form1());
         }     private void btnOpen_Click(object sender, System.EventArgs e)
        {
           Form2 frm=new Form2(this);
           frm.ShowDialog();
        }}Form2中(子窗口)public class Form2 : System.Windows.Forms.Form
    {
               private System.Windows.Forms.Button button1;
               private System.Windows.Forms.TextBox txtValue;           private Form _parentForm=null;
           public Form2()
           {   
                InitializeComponent(); 
           }      public Form2(Form parentForm)
          {
              InitializeComponent();
              this._parentForm =parentForm;
          }           ........          ........
       //更新父窗口中文本框中的值!
      

  22.   

    我在我的机子上用vs2008完全可以用,不知道lz用的是什么版本的
      

  23.   

    窗体内不能有PANEL 等容器控件!   当鼠标在这些控件中时,读不到当前位置!
      

  24.   

    定义自己的IMessageFilter,相当于win的钩子,相当好用  
    public class MyMessageFilter : IMessageFilter
        {
            public event EventHandler<EventArgs> MyMouseMove;
            public void OnMyMouseMove(object sender, EventArgs e)
            {
                if (MyMouseMove != null)
                {
                    MyMouseMove(sender, e);
                }
            }
            public bool PreFilterMessage(ref Message objMessage)
            {
                if (objMessage.Msg == 0x0200)
                { // WM_MOUSEMOVE
                    OnMyMouseMove(this, new EventArgs());
                    return true;
                }
                return false;
            }
        }