首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Win32 ERROR_NOACCESS在为非客户端鼠标离开(C#)调用_TrackMouseEvent时

Win32 ERROR_NOACCESS在为非客户端鼠标离开(C#)调用_TrackMouseEvent时
EN

Stack Overflow用户
提问于 2011-07-17 17:30:18
回答 1查看 661关注 0票数 0

目前,我正在通过拦截各种WndProc消息并在非客户端区域绘制代码来编写某种自定义表单边框。要为关闭按钮创建某种悬停效果等等,我需要跟踪鼠标指针。这很好,但是要接收WM_NCMOUSELEAVE消息,我必须首先调用TrackMouseEvent,根据MSDN。

令人惊讶的是,它不起作用。_TrackMouseEvent失败,Marshal.GetLastWin32Error()返回998 (对内存位置的无效访问)。

我毫无头绪,这是我的密码:

代码语言:javascript
复制
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());
    }

}

欢迎任何帮助。:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-17 17:32:30

变化

代码语言:javascript
复制
_TrackMouseEvent(TRACKMOUSEEVENT tme);

代码语言:javascript
复制
_TrackMouseEvent(ref TRACKMOUSEEVENT tme);

和改变

代码语言:javascript
复制
Native._TrackMouseEvent(tme)

代码语言:javascript
复制
Native._TrackMouseEvent(ref tme)

经验法则:

很少将结构作为参数传递;通常将它们作为指针传递。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6725526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档