C# 指向System.Windows.Forms.Cursor.Position.X的指针

C# 指向System.Windows.Forms.Cursor.Position.X的指针,c#,pointers,unsafe,C#,Pointers,Unsafe,我试图取消代码中的while(true): while(true) { int t = Cursor.Potion.X; } 我试着用这个: unsafe { int* p = &Cursor.Potion.X; } 但这带来了一个错误: 无法获取给定表达式的地址 我还尝试使用Cursor.Handle.ToPointer(),但这并没有给我带来任何帮助 我可以做些什么来不使用Cursor.Potion.X,但仍然跟踪Cursor.Potion.X? 对不起,我忘了提

我试图取消代码中的while(true):

while(true)
{
    int t = Cursor.Potion.X;
}
我试着用这个:

unsafe
{
    int* p = &Cursor.Potion.X;
}
但这带来了一个错误: 无法获取给定表达式的地址

我还尝试使用Cursor.Handle.ToPointer(),但这并没有给我带来任何帮助

我可以做些什么来不使用Cursor.Potion.X,但仍然跟踪Cursor.Potion.X?

对不起,我忘了提到我不想使用event。

您必须理解X只是a的一部分,而在C#中,X是a的一部分

获取对该结构的引用(创建指向它的指针)对您不会有多大帮助,因为您感兴趣的是在光标位置改变时接收更新。这不是C#的惯用用法,而且根本不起作用,因为position结构只创建并设置了瞬时值。它不会持续更新。事实上,作为一种值类型,它应该是不可变的

您需要的是观察您感兴趣的窗体或控件的事件

也许是这样的:

this.MouseMove += (System.Windows.Forms.MouseEventHandler)MouseMoveHandler;
 struct Point 
 {
      private int fieldX;
      private int fieldY;

      public Point(int x, int y) 
      {
          fieldX = x;
          fieldY = y;
      }

      public int X 
      {
         get {  return fieldX; }
      }

      public int Y
      {
         get {  return fieldY; }
      }
 }
 Point p = new Point(10, 20);
 unsafe
 {
     int* pX = &(p.X);
 }
 unsafe
 {
    int* px = &(p.fieldX);
 }
然后,定义鼠标位置更改时要调用的
mousemoveholder
函数:

private void MouseMoveHandler(object sender, System.Windows.Forms.MouseEventArgs e)
{      
   int mouseX = e.X;
   int mouseY = e.Y;

   // do what you need to do with the mouse position.. 
}

最后,这里有一个更新,更详细地解释了为什么你不能做你想做的事情,尽管有人告诉你这没有用

在.NET中,
Cursor.Position
的类型定义了两个属性:X和Y。那里的关键字是属性——它们不是字段。因此,为了说明这个概念,
结构可以这样定义:

this.MouseMove += (System.Windows.Forms.MouseEventHandler)MouseMoveHandler;
 struct Point 
 {
      private int fieldX;
      private int fieldY;

      public Point(int x, int y) 
      {
          fieldX = x;
          fieldY = y;
      }

      public int X 
      {
         get {  return fieldX; }
      }

      public int Y
      {
         get {  return fieldY; }
      }
 }
 Point p = new Point(10, 20);
 unsafe
 {
     int* pX = &(p.X);
 }
 unsafe
 {
    int* px = &(p.fieldX);
 }
现在,如果您尝试编写如下代码:

this.MouseMove += (System.Windows.Forms.MouseEventHandler)MouseMoveHandler;
 struct Point 
 {
      private int fieldX;
      private int fieldY;

      public Point(int x, int y) 
      {
          fieldX = x;
          fieldY = y;
      }

      public int X 
      {
         get {  return fieldX; }
      }

      public int Y
      {
         get {  return fieldY; }
      }
 }
 Point p = new Point(10, 20);
 unsafe
 {
     int* pX = &(p.X);
 }
 unsafe
 {
    int* px = &(p.fieldX);
 }
它将失败,因为您试图获取指向结构的属性(
X
)的指针,而不是指向存储在该属性的备份字段中的实际数据(
fieldX

如果您有权访问
结构,并且您可以将其更改为公开支持字段,方法是将其公开或导出指向它的指针(这是错误的,也是不可取的,但出于参数的考虑),那么您可以执行以下操作:

this.MouseMove += (System.Windows.Forms.MouseEventHandler)MouseMoveHandler;
 struct Point 
 {
      private int fieldX;
      private int fieldY;

      public Point(int x, int y) 
      {
          fieldX = x;
          fieldY = y;
      }

      public int X 
      {
         get {  return fieldX; }
      }

      public int Y
      {
         get {  return fieldY; }
      }
 }
 Point p = new Point(10, 20);
 unsafe
 {
     int* pX = &(p.X);
 }
 unsafe
 {
    int* px = &(p.fieldX);
 }
因此,希望您现在能够确切地理解为什么首先会出现错误


除非结构公开它,否则无法获取指向结构内部成员的指针。

while循环仍将被阻止。为什么你需要一个指针?您可以随时从代码中的任何位置访问光标位置。这是一个示例,说明了我不想使用的内容(虽然)这不是我一直使用的实际方法。为什么投票失败?很抱歉,我忘了提到我不想使用evnt。@user1840422-您为什么不想使用事件?你到底想做什么?我想用指针。。。我无法使用此事件,因为该项目是我的事件,我需要更正该事件,因此我无法使用MouseMove事件。您是否正在尝试创建类似WinForms framework的鼠标移动事件机制的内容?如果是这样的话,你必须更好地解释你想做什么。很明显,获得一个指向一个值类型的指针,而这个值类型不会随着时间的推移而改变,这将是无用的,而且不是正确的方法。可能这种方法不是正确的方法,但我喜欢按我的方式做事情,而不是正常的方式。。。所以我需要那条线,它可以提供指向光标X位置的指针