目前,我正在通过拦截各种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());
}
}欢迎任何帮助。:)
发布于 2011-07-17 17:32:30
变化
_TrackMouseEvent(TRACKMOUSEEVENT tme);至
_TrackMouseEvent(ref TRACKMOUSEEVENT tme);和改变
Native._TrackMouseEvent(tme)至
Native._TrackMouseEvent(ref tme)经验法则:
很少将结构作为参数传递;通常将它们作为指针传递。
https://stackoverflow.com/questions/6725526
复制相似问题