You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何WinForms应用无法接收PostMessage发送的点击消息?

PostMessage点击WebView2实例内部无响应问题

尝试使用PostMessage点击WebView2实例内部时,窗口无响应。

使用以下ClickWindow方法:

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

public const uint WM_LBUTTONDOWN = 0x0201;
public const uint WM_LBUTTONUP = 0x0202;

public struct RECT
{
   public int Left;        
   public int Top;         
   public int Right;       
   public int Bottom;      
}
public void ClickWindow(string windowName, int x, int y)
{
    // Find the window by name
    IntPtr hwnd = FindWindow(null, windowName);

    // Get the window's rectangle
    RECT rect = new RECT();
    GetWindowRect(hwnd, out rect);

    // Calculate absolute x and y
    int absoluteX = rect.Left + x;
    int absoluteY = rect.Top + y;

    // Send the mouse down and up messages
    PostMessage(hwnd, WM_LBUTTONDOWN, 1, (absoluteY << 16) + absoluteX);
    PostMessage(hwnd, WM_LBUTTONUP, 0, (absoluteY << 16) + absoluteX);
}

该方法可成功点击Firefox窗口内的按钮,但在我的WinForms应用中无法生效,恳请各位提供帮助,谢谢。

编辑补充: 我已将上述代码修改为以下版本。通过WinSpy++发现部分子窗口偶尔能收到点击,因此我让代码随机选择其中一个子窗口进行点击。

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);

[DllImport("user32.dll", SetLastError = true)]
private static extern bool GetWindowRect(IntPtr hwnd, out Rect lpRect);

[DllImport("user32.dll")]
private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

private const uint WM_LBUTTONDOWN = 0x0201;
private const uint WM_LBUTTONUP = 0x0202;

#pragma warning disable CS0649
public struct Rect
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}
#pragma warning restore CS0649

private void ClickWindow(int relativeX, int relativeY)
{
    // Find the window by name
    var ran = new Random().Next(4);
    var hwnd = Central.WebView2.Handle;
    if (ran > 1)
        hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Chrome_WidgetWin_0", IntPtr.Zero);
    if (ran > 2)
        hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Chrome_WidgetWin_1", IntPtr.Zero);
    if (ran > 3)
        hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Chrome_RenderWidgetHostHWND", IntPtr.Zero);

    // Get the window's rectangle
    GetWindowRect(hwnd, out var rect);

    // Calculate absolute x and y
    var absoluteX = rect.Left + relativeX;
    var absoluteY = rect.Top + relativeY;

    // Send the mouse down and up messages
    PostMessage(hwnd, WM_LBUTTONDOWN, 1, (absoluteY << 16) + absoluteX);
    PostMessage(hwnd, WM_LBUTTONUP, 0, (absoluteY << 16) + absoluteX);
}

内容的提问来源于stack exchange,提问作者Aiden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:57:03