为何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
相关产品推荐
相关产品推荐

