C# – 如何将PostMessage嵌入WebBrowser中嵌入的Flash窗口?

我想知道是否有任何方法可以锁定Flash窗口并向其发送消息? 这里的另一个人得到了答案,他的名字是Spencer K.他的问题是: 通过C#中的WebBrowser将模拟点击发送到HTML中嵌入的flash对象

不幸的是,K先生并不是非常具体,而且他为阅读他的问题的人留下的只是他“得到了手柄,然后通过手柄迭代。” 我不太确定他的意思。 我使用EnumWindows遍历所有可见的句柄无济于事,因为它没有返回一个闪存窗口的窗口。

我希望有人能告诉我,因为这几天让我发疯了。

编辑:我刚刚决定将SWF对象插入到我的表单中并将消息发布到该句柄。

实际上flash窗口也有自己的手柄。 要获得它,你必须从Spy ++中获取它所嵌入的控件的类名,然后你可以像这样:

[DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle); public IntPtr Flash() { IntPtr pControl; pControl = FindWindowEx(webBrowser1.Handle, IntPtr.Zero, "Shell Embedding", IntPtr.Zero); pControl = FindWindowEx(pControl, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero); pControl = FindWindowEx(pControl, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero); pControl = FindWindowEx(pControl, IntPtr.Zero, "MacromediaFlashPlayerActiveX", IntPtr.Zero); return pControl; } 

获得句柄后,您可以发布点击次数:

  [DllImport("user32.dll", SetLastError = true)] static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); public enum WMessages : int { WM_LBUTTONDOWN = 0x201, WM_LBUTTONUP = 0x202 } private int MAKELPARAM(int p, int p_2) { return ((p_2 << 16) | (p & 0xFFFF)); } public void DoMouseLeftClick(IntPtr handle, Point x) { PostMessage(handle, (uint)WMessages.WM_LBUTTONDOWN, 0, MAKELPARAM(xX, xY)); PostMessage(handle, (uint)WMessages.WM_LBUTTONUP, 0, MAKELPARAM(xX, xY)); } 

这些点将相对于客户端,因此当您保存它们时,您应该像这样保存它:

  List plist = new List(); private void webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { switch (e.KeyCode) { case Keys.C: plist.Add(webBrowser1.PointToClient(Cursor.Position)); break; default: break; } } 

希望这很有帮助

你可以通过javascript来做到这一点。

导入此:

 import flash.external.ExternalInterface; 

将此添加到您的AS代码:

 if (ExternalInterface.available) { // add external interface ExternalInterface.addCallback("jsFunction", asFunction); } public static function asFunction(message:String):void { } 

在flash对象的JS对象上,您可以调用此函数:

 jsObject.jsFunction("message"); 

这是获取flash对象的js对象的函数:

 var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1; jsObject = InternetExplorer ? window.jsObjectName: window.document.jsObjectName; 

我没有测试这段代码,我只是将它复制出一个项目。

编辑:添加了js函数来获取js对象

Flash窗口可能没有自己的句柄,因为它嵌入在网页中。 您可能希望将消息发布到Web浏览器窗口(这就是K先生所做的)。

如果这对您不起作用,我唯一知道的其他选项是通过WebDriver或WatiN获取对浏览器的控制权,并使用javascript与flash对象进行交互。

要在flash对象中调用函数,你可以使用这段代码

  swfobject.CallFunction( "" + " " yourvalue "  "); 

有关更多信息,请访问以下链接: communication-betwen-c-and-an-embeded-flash-application

我在我的表单应用程序中尝试使用flash对象并且它可以工作,但我没有将它用于webbrowser