4

我想知道是否有任何方法可以锁定 Flash 窗口并向其发布消息?这里的另一个人有答案,他的名字是 Spencer K。他的问题是: Send simulation click via WebBrowser in C# to flash object embedded in HTML

不幸的是,K 先生并不是很具体,他给阅读他问题的人留下的只是他“得到了句柄,然后遍历了句柄”。我不太确定他的意思是什么。我使用 EnumWindows 遍历了所有可见的句柄但无济于事,因为它没有返回一个作为 Flash 窗口的窗口。

我希望这里有人能告诉我,因为过去几天它一直让我发疯。

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

4

4 回答 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;
        }
    }

希望这有帮助

于 2012-06-22T17:56:51.067 回答
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 对象

于 2012-04-16T23:59:13.787 回答
0

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

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

于 2012-04-17T00:00:40.767 回答
0

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

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

欲了解更多信息,请点击此链接:communicate-betwen-c-and-an-embeded-flash-application

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

于 2012-06-22T18:02:56.473 回答