gpt4 book ai didi

c# - SendMessage 模拟右键单击使目标应用程序崩溃

转载 作者:太空狗 更新时间:2023-10-29 23:18:04 27 4
gpt4 key购买 nike

我正在编写 C# 自动化工具。

由于 Microsoft UI Automation 不提供任何模拟右键单击或弹出上下文菜单的方法,因此我使用 SendMessage 来代替。我宁愿不使用 SendInput,因为我不想获得焦点。

但是,当我调用 SendMessage 时,它会使目标应用程序崩溃。

这是我的代码:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

public void RightClick<T>(T element) where T: AutomationElementWrapper
{
const int MOUSEEVENTF_RIGHTDOWN = 0x0008; /* right button down */
const int MOUSEEVENTF_RIGHTUP = 0x0010; /* right button up */

var point = element.Element.GetClickablePoint();
var processId = element.Element.GetCurrentPropertyValue(AutomationElement.ProcessIdProperty);
var window = AutomationElement.RootElement.FindFirst(
TreeScope.Children,
new PropertyCondition(AutomationElement.ProcessIdProperty,
processId));
var handle = window.Current.NativeWindowHandle;

var x = point.X;
var y = point.Y;

var value = ((int)x)<<16 + (int)y;

SendMessage(new IntPtr(handle), MOUSEEVENTF_RIGHTDOWN, IntPtr.Zero, new IntPtr(value));
SendMessage(new IntPtr(handle), MOUSEEVENTF_RIGHTUP, IntPtr.Zero, new IntPtr(value));
}

知道我做错了什么吗?

最佳答案

你混淆了你的类型。您正在使用 SendMessage,它接收一个窗口消息(按照约定命名为 WM_...),但您传递给它的是一个 MOUSEINPUT.dwFlags 用于 SendInput 的值(名为 MOUSEEVENTF_...)。你基本上是在传递胡言乱语。

您的代码实际做的是发送一个数值为 8 的窗口消息(在窗口消息中,表示 WM_KILLFOCUS),然后是一个 0x10 == 16 的窗口消息(WM_CLOSE).后者可能会给您带来问题——您要关闭窗口。我不确定它为什么会崩溃,但它肯定会退出。

如果您使用SendMessage,您需要向它传递窗口消息(WM_,例如WM_RBUTTONDOWNWM_RBUTTONUP)。

关于c# - SendMessage 模拟右键单击使目标应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6510438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com