0

我开发了响应低级鼠标点击的 C# 应用程序。我用鼠标钩来做到这一点。该应用程序运行良好,每当我单击任何窗口时,它都会响应并执行某些任务。但我想在这里做一个修改。每当单击窗口上的任何按钮时,我都想响应鼠标单击。如果我单击窗口的普通区域,它不应该响应。目前它会响应我点击的任何地方。我找不到如何识别我是否点击了按钮。

这是我的代码:

private IntPtr SetHook(MouseHookHandler proc)
    {
        using (ProcessModule module = Process.GetCurrentProcess().MainModule)
            return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(module.ModuleName), 0);
    }
    private IntPtr HookFunc(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0)
        {
            if (MouseMessages.WM_LBUTTONUP == (MouseMessages)wParam)
                if (LeftButtonUp != null)
                    LeftButtonUp((MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)));
            if (MouseMessages.WM_RBUTTONUP == (MouseMessages)wParam)
                if (RightButtonUp != null)
                    RightButtonUp((MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)));

        }
        return CallNextHookEx(hookID, nCode, wParam, lParam);
    }

[StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int x;
        public int y;
    }

 [StructLayout(LayoutKind.Sequential)]
    public struct MSLLHOOKSTRUCT
    {
        public POINT pt;
        public uint mouseData;
        public uint flags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
        MouseHookHandler lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

请帮我解决这个问题。谢谢你。

4

1 回答 1

0

看来您正在寻找类似WindowFromPoint的东西。

调用它以查看鼠标光标下的内容,然后您可以查询它以获取您感兴趣的任何属性。

于 2015-09-25T10:52:28.063 回答