我用C#和.NET 4.0编写了简单的测试程序。
[DllImport("user32.dll")]
static extern IntPtr WindowFromPoint(int xPoint, int yPoint);
Point pt = MousePosition;
IntPtr w = WindowFromPoint(pt.X, pt.Y);
如果构建为 32 位,则可以工作。但如果它构建为 64 位,则会返回不相关的窗口句柄。有解决办法或替代方案吗?
对啊,那不行。 WindowFromPoint() 不需要两个参数,它只需要一个。 POINT 类型的结构。 你在 32 位代码中完全是偶然地侥幸逃脱了惩罚,但在 64 位模式下运气就耗尽了,因为它以不同的方式传递参数。
使用 pinvoke.net 网站查找正确的 pinvoke 声明。
这对我有用:
[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(System.Drawing.Point pt);
并使用:
IntPtr hwnd = WindowFromPoint(new System.Drawing.Point((int)obj.X, (int)obj.Y));
主要文档还说我们永远不应该使用
System.Window.Point
我们应该使用 System.Drawing.Point.