Win32 ERROR_NOACCESS при вызове _TrackMouseEvent для не-клиентского отпуска мыши (C#)
В настоящее время я кодирую какие-то пользовательские границы формы, перехватывая различные сообщения 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 ответ
Решение
+ Изменить
_TrackMouseEvent(TRACKMOUSEEVENT tme);
в
_TrackMouseEvent(ref TRACKMOUSEEVENT tme);
и изменить
Native._TrackMouseEvent(tme)
в
Native._TrackMouseEvent(ref tme)
Практическое правило:
Вы редко передаете структуры как параметры; Вы обычно передаете их как указатели.