SendMessage 不适用于 InternetExplorer 对象

Posted

技术标签:

【中文标题】SendMessage 不适用于 InternetExplorer 对象【英文标题】:SendMessage not working with InternetExplorer object 【发布时间】:2015-07-18 01:00:42 【问题描述】:

我正在尝试为 InternetExplorer 对象模拟鼠标左键单击,即使 IE 对象是背景窗口也是如此。我使用的系统函数是 SendMessage。下面是相关代码。

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

InternetExplorer IE = new InternetExplorer();
IntPtr handle = (IntPtr) IE.HWND;

int x = 50;
int y = 50;
IntPtr lParam = (IntPtr)((y << 16) | x); // X and Y coordinates of the click
IntPtr wParam = IntPtr.Zero;

const uint downCode = 0x0201; 
const uint upCode = 0x202;
SendMessage(handle, downCode, wParam, lParam); // mousedown
SendMessage(handle, upCode, wParam, lParam); // mouseup

我确定我指定的位置会在左键单击时生成一个新的 IE 窗口。但是,使用上面的代码不会发生这种情况。那么,我在这里缺少什么?

更新 操作系统是 Windows 7 专业版。 IDE 是 Visual Studio 2013 Pro。

我还尝试添加清单并根据this page 指定 UIAccess="true"。但它没有用。

【问题讨论】:

仅供参考,如果这是您的意图,有更好的方法来调用元素的点击(通过 DOM) 谢谢,亚历克斯。我一定会尝试 DOM 方法。但是,与此同时,我仍然想了解为什么 SendMessage 不起作用。 答案在这里:***.com/a/3443518/932282 还有:***.com/a/7121314/932282 我在这里看不到的是您如何设置鼠标位置。如果您的意图是将鼠标悬停在单击之前它只会悬停的位置上,那么这种方法可以正常工作。如果没有,您需要将鼠标指针放在适当的位置,然后才能点击您想要的。 【参考方案1】:

您不能使用 postmessage/sendmessage 模拟鼠标事件,因为鼠标向上/向下事件总是在 当前 光标位置发送。您可以先设置鼠标位置,但当窗口在后台或最小化时,这将不起作用。

更多信息:here、here 和 here。

【讨论】:

以上是关于SendMessage 不适用于 InternetExplorer 对象的主要内容,如果未能解决你的问题,请参考以下文章

默认文本框消息不适用于 Internet Explorer

对谷歌字体使用@import 不适用于 Internet Explorer

字符串上的 jQuery 选择器不适用于 Internet Explorer

@font-face 不适用于特定版本的 Internet Explorer 11

过滤器:模糊(1px);不适用于 Firefox、Internet Explorer 和 Opera

添加 href 属性后,ng-click 不适用于 Internet Explorer 中的锚标记