【问题标题】:C# - How to PostMessage to a flash window embedded in a WebBrowser?C# - 如何将消息发布到嵌入在 WebBrowser 中的 Flash 窗口?
【发布时间】:2012-04-28 07:34:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# flash browser postmessage


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      其实flash window也有自己的句柄。要获取它,您必须从 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;
              }
          }
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          你可以通过 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 的另一个示例,请参阅jodieorourke.com/view.php?id=122&blog=news
          • 这不是我真正想要的。 ExternalInterface 不模仿击键或鼠标按钮按下。 ExternalInterface 用于 Javascript 和 Actionscript AFAIK 之间的接口。
          猜你喜欢
          • 2012-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多