C# - 如何向嵌入在WebBrowser中的Flash窗口发送PostMessage?

4
我想知道是否有办法锁定Flash窗口并向其发布消息? 这里的另一个人已经给出了答案,他的名字是Spencer K。他的问题是: 在C#中通过WebBrowser发送模拟点击到嵌入在HTML中的flash对象
不幸的是,K先生没有提供详细信息,他留下的只是“获取了句柄,然后迭代处理句柄”。我不太确定他的意思。使用EnumWindows迭代所有可见句柄未能返回一个Flash窗口。
希望这里有人能告诉我,因为这让我疯狂了几天。
编辑:我刚刚决定将SWF对象插入到我的表单中,并向该句柄发布消息。
4个回答

8

实际上,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(x.X, x.Y));
        PostMessage(handle, (uint)WMessages.WM_LBUTTONUP, 0, MAKELPARAM(x.X, x.Y));            
    }

这些点将与客户端相关,因此在保存时,您应该像这样保存:

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

希望您能从中受益。

1

你可以通过 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 函数


有关如何使用ExternalInterface的另一个示例,请参见http://jodieorourke.com/view.php?id=122&blog=news。 - rsenna
这不是我真正想要的。ExternalInterface不能模拟按键或鼠标按钮的按下。据我所知,ExternalInterface用于在Javascript和Actionscript之间进行接口交互。 - Jc Gurango

0

要在 Flash 对象中调用函数,您可以使用以下代码

 swfobject.CallFunction(
               "<invoke name=\"yourfunction\" returntype=\"xml\">" +
               " <arguments><number>" yourvalue "</number></arguments> </invoke> ");

更多信息请点击此链接:在C和嵌入式Flash应用程序之间通信

我在我的表单应用程序中尝试了它,它可以工作,但我没有在Web浏览器中使用它。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接