获取鼠标光标信息:WinForms和WPF C#的区别

3

我正在尝试将我的代码从WinForms转移到WPF,以更好地控制UI,但遇到了一些问题。

以下代码片段在WinForms中返回True,在WPF中返回False。我怀疑WPF面板对光标有影响,所以我尝试最小化启动应用程序,但仍然失败了。由于GetCursorInfo是PInvoke,我认为它在编程语言中应该是相同的。你有什么建议吗?

    private CURSORINFO ci;

    [StructLayout(LayoutKind.Sequential)]
    public struct CURSORINFO
    {
        public Int32 cbSize;        // Specifies the size, in bytes, of the structure. 
        public Int32 flags;         // Specifies the cursor state.
        public IntPtr hCursor;      // Handle to the cursor. 
        Point point; // Should already marshal correctly.
    }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorInfo(ref CURSORINFO pci);

    public MainWindow()
    {
        InitializeComponent();

        ci = new CURSORINFO();

        ci.cbSize = Marshal.SizeOf(ci);

        MessageBox.Show(GetCursorInfo(ref ci).ToString());
    }    

该函数支持GetLastError。当其返回false时调用它以获取错误代码。 - rene
错误代码是87,我在系统代码中查找到它的含义是“参数不正确”。这非常奇怪,因为PInvoke函数的参数在所有编程语言中都是通用的。 - Leo Long Vu
也许你在WPF中调用得太早了?因此,在WPF上下文中,可以调用该函数的条件基本上是不正确的。不确定这些条件是什么,因此需要其他人来回答。 - rene
我发布的实际上是完整的测试代码,剩下的部分只是使用代码和类初始化。 - Leo Long Vu
你能把那段代码移到Loaded事件中吗? - rene
1个回答

2
    Point point; // Should already marshal correctly.

它不行。对于System.Drawing.Point有效,但对于System.Windows.Point无效,WPF类型使用double作为X和Y成员。因此,CURSORINFO.cbSize将过大,这足以使您遭受错误87("参数不正确"),它太大了。

要么完整输入名称。如果您不想添加对System.Drawing的引用,只需自己声明POINT结构即可。并且不要忘记返回的信息使用像素作为单位,您通常需要在WPF应用程序中转换为英寸


确实,定义Point的问题非常难以调试。非常感谢您的答案。 - Leo Long Vu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接