【问题标题】:GetCursorInfo WinForms vs WPF C#GetCursorInfo WinForms 与 WPF C#
【发布时间】:2018-06-30 14:56:15
【问题描述】:

我无法将我的代码片段从 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时调用,获取错误码。
  • 错误是87,我查了系统代码是“参数不正确”。这很奇怪,因为 PInvoke 函数的参数在所有编程语言中都是通用的。
  • 也许你在 WPF 中称它为时过早?所以基本上你可以调用该函数的条件在 WPF 上下文中是不正确的。不知道这些条件是什么,所以这需要其他人来回答。
  • 我贴的其实是完整的测试代码,剩下的只是使用代码和类初始化。
  • 您可以将该代码移至Loaded 事件吗?

标签: c# wpf winforms winapi


【解决方案1】:
    Point point; // Should already marshal correctly.

它没有。适用于 System.Drawing.Point 但不适用于 System.Windows.Point,WPF 类型对 X 和 Y 成员使用 double。所以 CURSORINFO.cbSize 会太大,足以让你报 87 错误(“参数不正确”),太大了。

输入完整的名称。或者,如果您不想添加对 System.Drawing 的引用,只需自己声明 POINT 结构。并且不要忘记返回的信息以像素为单位,您通常希望在 WPF 应用程序中 convert to inches

【讨论】:

  • 确实是定义Point的问题是一个非常难以调试的问题。非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2011-02-27
  • 2011-03-26
相关资源
最近更新 更多