MouseDown然后MouseUp不起作用

时间:2010-02-02 01:22:18

标签: winapi windows-7

我正在尝试将Windows 7应用程序上的鼠标输入重定向到其他窗口。 如果我在获得WM_LBUTTONUP时这样做,它可以工作(其中MouseDown和MouseUp是Win api中的SendInput函数):

SetForegroundWindow( other window );
SetCursorPos( somewhere on the window );
MouseDown();
MouseUp();
SetCursorPos( back );
SetForegroundWindow( main window );

但我不想只发布鼠标,我希望能够捕获所有鼠标内容,包括移动和拖动。

所以这是合乎逻辑的事情,但它不起作用:

WM_LBUTTONDOWN:
Do everything like before without MouseUp()

WM_LBUTTONUP:
Do everything like before without MouseDown()

这甚至不适用于常规点击。我无法弄清楚为什么。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

可能值得查看SendMessage / PostMessage P / Invoke调用,并将消息直接发送到其他应用程序的窗口。您需要对参数进行一些翻译,以便鼠标事件的坐标与您在其他应用程序中的要求相关联,但这样做并不是什么大事......

编辑 - >我在之前挖出了一些我已经完成此操作的代码...这是来自一个窗口,它出现在树视图的顶部,并替换了该树视图的默认窗口工具提示。

    private IntPtr _translate(IntPtr LParam)
    {
        // lparam is currently in client co-ordinates, and we need to translate those into client co-ordinates of
        // the tree view we're attached to
        int x = (int)LParam & 0xffff;
        int y = (int)LParam >> 16;

        Point screenPoint = this.PointToScreen(new Point(x, y));
        Point treeViewClientPoint = _tv.PointToClient(screenPoint);

        return (IntPtr)((treeViewClientPoint.Y << 16) | (treeViewClientPoint.X & 0xffff));
    }

    const int MA_NOACTIVATE = 3;

    protected override void WndProc(ref Message m)
    {
        switch ((WM)m.Msg)
        {
            case WM.LBUTTONDBLCLK:
            case WM.RBUTTONDBLCLK:
            case WM.MBUTTONDBLCLK:
            case WM.XBUTTONDBLCLK:
            {
                IntPtr i = _translate(m.LParam);
                _hide();
                InteropHelper.PostMessage(_tv.Handle, m.Msg, m.WParam, i);
                return;
            }
            case WM.MOUSEACTIVATE:
            {
                m.Result = new IntPtr(MA_NOACTIVATE);
                return;
            }
            case WM.MOUSEMOVE:
            case WM.MOUSEHWHEEL:
            case WM.LBUTTONUP:
            case WM.RBUTTONUP:
            case WM.MBUTTONUP:
            case WM.XBUTTONUP:
            case WM.LBUTTONDOWN:
            case WM.RBUTTONDOWN:
            case WM.MBUTTONDOWN:
            case WM.XBUTTONDOWN:
            {
                IntPtr i = _translate(m.LParam);
                InteropHelper.PostMessage(_tv.Handle, m.Msg, m.WParam, i);
                return;
            }         
        }
        base.WndProc(ref m);
    }

答案 1 :(得分:0)

鼠标按钮很时髦。当它变得向下然后向上,在某种程度上它们转换为点击(我想在某些时候鼠标被吃掉了,但我可能没有正确地回忆起来。)

它可以是任意数量的东西,但如果其他窗口(或不是)将按钮向下/向上转换为鼠标点击,则可能会使您的代码混乱。

我建议你打印很多调试信息,并试着找出系统正在做什么。