Win32 ERROR_NOACCESS при вызове _TrackMouseEvent для не-клиентского отпуска мыши (C #) - PullRequest
0 голосов
/ 17 июля 2011

В настоящее время я кодирую какие-то пользовательские границы формы, перехватывая различные сообщения WndProc и рисуя в не клиентской области.Чтобы создать какие-то эффекты при наведении на кнопку закрытия и так далее, мне нужно отслеживать указатель мыши.Это работает довольно хорошо, но чтобы получить сообщение WM_NCMOUSELEAVE , мне нужно сначала позвонить _TrackMouseEvent , согласно MSDN.

Удивительно, но не работает._TrackMouseEvent завершается ошибкой, Marshal.GetLastWin32Error () возвращает 998 ( Неверный доступ к ячейке памяти ).

Я не понимаю, поэтому вот мой код:

class Native
{
    [DllImport("comctl32.dll", SetLastError = true)]
    public static extern bool _TrackMouseEvent(TRACKMOUSEEVENT tme);

    public struct TRACKMOUSEEVENT
    {
        public int cbSize;
        public int dwFlags;
        public IntPtr hwndTrack;
        public int dwHowerTime;
    }

    public const int TME_LEAVE = 0x00000002;
    public const int TME_NONCLIENT = 0x00000010;
}

private void ActivateLeaveTracking()
{
    Native.TRACKMOUSEEVENT tme = new Native.TRACKMOUSEEVENT();
    tme.hwndTrack = this.Handle;
    tme.dwHowerTime = 0;
    tme.dwFlags = Native.TME_LEAVE | Native.TME_NONCLIENT;
    tme.cbSize = Marshal.SizeOf(typeof(Native.TRACKMOUSEEVENT));
    if (!Native._TrackMouseEvent(tme))
    {
        throw new Exception(Marshal.GetLastWin32Error().ToString());
    }

}

Любая помощь приветствуется.:)

1 Ответ

5 голосов
/ 17 июля 2011

Изменить

_TrackMouseEvent(TRACKMOUSEEVENT tme);

на

_TrackMouseEvent(ref TRACKMOUSEEVENT tme);

и изменить

Native._TrackMouseEvent(tme)

на

Native._TrackMouseEvent(ref tme)

Правило большого пальца:

Вы редко передаете структуры в качестве параметров;Вы обычно передаете их как указатели.

...