GetCursorInfo WinForms против WPF C # - PullRequest
0 голосов
/ 30 июня 2018

У меня проблемы с передачей фрагментов кода из WinForms в WPF, чтобы лучше контролировать пользовательский интерфейс.

Следующий фрагмент кода возвращает True в WinForms, но False в WPF. Я подозреваю, что панели 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());
    }    

1 Ответ

0 голосов
/ 01 июля 2018
    Point point; // Should already marshal correctly.

Это не так. Работает для System.Drawing.Point, но не для System.Windows.Point, тип WPF использует double для элементов X и Y. Таким образом, CURSORINFO.cbSize будет слишком большим, и этого достаточно, чтобы дать вам ошибку 87 («Параметр неверен»), он слишком велик.

Либо введите имя полностью. Или, если вы не хотите добавлять ссылку на System.Drawing, просто объявите структуру POINT самостоятельно. И не забывайте, что возвращаемая информация использует пиксели как единое целое, обычно вы хотите преобразовать в дюймы в приложении WPF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...