首页 > 解决方案 > c# SendMessage 到没有句柄的按钮

问题描述

这是类似的主题,但无法正常工作。

https://social.msdn.microsoft.com/Forums/es-ES/21cc58c5-fc34-45b0-9407-952aae80fc1c/how-do-i-simulate-a-mouse-click-in-an-inactive-window?论坛=vbinterop

我想将点击发送到没有句柄的按钮。Spy++ 显示它没有句柄。我可以让它与这些代码一起工作,但它必须是一个活动窗口,并且只使用屏幕位置而不是控制手柄位置。我想将它发送到带有没有窗口句柄的子控件的非活动窗口。就像 TPanel 中某个位置的最小化窗口一样。

    public static void ClickLeftMouseButton(int x, int y)
    {
        var oldPos = Cursor.Position;

        INPUT mouseInput = new INPUT();
        mouseInput.type = SendInputEventType.InputMouse;
        mouseInput.mkhi.mi.dx = CalculateAbsoluteCoordinateX(x);
        mouseInput.mkhi.mi.dy = CalculateAbsoluteCoordinateY(y);
        mouseInput.mkhi.mi.mouseData = 0;


        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE | MouseEventFlags.MOUSEEVENTF_ABSOLUTE;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

        mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
        SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

        /// return mouse 
        Cursor.Position = oldPos;
    }

我在使用 SendMessage() 或 PostMessage 时遇到问题。

第一个问题是关于 SendMessage 或 PostMessage。

static extern bool PostMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);

IParam 的鼠标位置是相对于屏幕还是相对于手柄控件。

假设该按钮没有句柄,但我想使用父句柄并获取父句柄(TPanel)的相对位置并初始化该单击。它是否单击?

上面的链接确实显示了一个句柄,但是那个句柄是从哪里来的呢?它是整个 gui 窗口句柄还是该非句柄按钮的父级。像TPanel?

立场是另一个问题。如果 PostMessage 基于句柄。位置是手柄的左上角还是屏幕的左上角?

假设屏幕范围从 0,0 到 100,100。PostMessage的句柄是10,10到20,20。可以在句柄位置范围之外初始化点击吗?

谢谢

标签: c#sendmessage

解决方案


推荐阅读