Winapi MouseDown,然后MouseUp不';行不通

Winapi MouseDown,然后MouseUp不';行不通,winapi,windows-7,Winapi,Windows 7,我正在尝试将Windows 7应用程序上的鼠标输入重定向到其他窗口。 如果我在得到WM_LBUTTONUP时这样做,它就会工作(其中MouseDown和MouseUp是WinAPI中的SendInput函数): 但我不想只做鼠标释放,我想能够捕捉所有鼠标的东西,包括移动和拖动 所以这是下一个合乎逻辑的事情,但它不起作用: WM_LBUTTONDOWN: Do everything like before without MouseUp() WM_LBUTTONUP: Do everything

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

但我不想只做鼠标释放,我想能够捕捉所有鼠标的东西,包括移动和拖动

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

WM_LBUTTONDOWN:
Do everything like before without MouseUp()

WM_LBUTTONUP:
Do everything like before without MouseDown()
这甚至不适用于常规点击。我不明白为什么。
有人能帮忙吗?

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

编辑->我在以前做过的地方找到了一些代码。。。这是从出现在树视图顶部的窗口中获取的,并替换该树视图的默认windows工具提示

    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);
    }
private IntPtr\u translate(IntPtr LParam)
{
//lparam目前处于客户坐标中,我们需要将这些坐标转换为
//我们附加到的树视图
intx=(int)LParam&0xffff;
int y=(int)LParam>>16;
点屏幕点=这个点到屏幕(新点(x,y));
Point TreeView客户端点=_tv.Point到客户端(屏幕点);

return(IntPtr)((treeViewClientPoint.Y鼠标按钮很时髦。当它先向下然后向上时,在某种程度上会转换为单击(我想在某个时候鼠标向上会被吃掉,但我可能没有正确地回忆)

它可以是任何数量的东西,但如果其他窗口正在(或没有)将按钮向下/向上转换为鼠标单击,则可能会混淆您的代码


我建议您打印大量调试信息,并尝试准确了解系统正在做什么。

我真的认为您的做法是错误的。为什么不退后一步,告诉我们您为什么认为需要这样做,我打赌有人可以想出另一种解决方案。简单地说:我希望能够单击某个我们在一个窗口中,希望另一个窗口对这些低级点击做出响应。例如:在主窗口上点击并从(10,20)拖动到(40,50),实际上是从(70,35)拖动到(100,65)在另一个窗口上。是的,但如果你正在做例如拖动,上下不转换为点击的事实应该是完全正常的,对吗?老实说,我不能说。摇摆的内部(更糟糕的是,awt)深度和可怕。除非绝对无法避免,否则我不会处理AWT的内部工作。你确定无法避免吗?主窗口的事件处理程序可以直接管理辅助窗口吗?我无法让SendMessage或PostMessage用于发送鼠标输入。它已被处理,但未被用户响应窗口。我已经用一些代码更新了我的答案,我以前也这么做过。
    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);
    }