2012-04-16 5 views
4

Хотелось бы узнать, есть ли способ заблокировать Flash-окно и отправить ему сообщение? Другой человек здесь ответил на это, его зовут Спенсер К. Его вопрос был: Sending simulated click via WebBrowser in C# to flash object embedded in HTMLC# - Как отправить сообщение в окно Flash, встроенное в WebBrowser?

К сожалению, г-н К был не очень конкретным, и все, что он оставил для людей, читающих его вопрос, состояло в том, что он " достал ручку, а затем повторил через ручки ». Я не очень уверен, что он имел в виду. Я выполнил все видимые дескрипторы с помощью EnumWindows безрезультатно, поскольку это не возвращало окно, которое было флэш-окном.

Надеюсь, что кто-то здесь мог мне сказать, поскольку это заставляло меня сходить с ума в течение последних нескольких дней.

EDIT: Я только что решил включить в SWF-объект объект SWF и отправить сообщение этому дескриптору.

ответ

1

Вы можете сделать это с помощью javascript.

Импорт этого:

import flash.external.ExternalInterface; 

объявления это ваш AS код:

if (ExternalInterface.available) { 
    // add external interface 
    ExternalInterface.addCallback("jsFunction", asFunction); 
} 

public static function asFunction(message:String):void { 
} 

На ваш JS объект флэш-объектов вы можете вызвать эту функцию:

jsObject.jsFunction("message"); 

Это является функцией для получения объекта js объекта вспышки:

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

Я не тестировал этот код, я просто скопировал его из проекта.

редактирования: добавлена ​​JS работать, чтобы получить JS объект

+0

. Еще один пример использования ExternalInterface см. http://jodieorourke.com/view.php?id=122&blog=news. – rsenna

+0

Это не то, что я ищу. ExternalInterface не имитирует нажатия клавиш или нажатия кнопок мыши. ExternalInterface используется для взаимодействия между Javascript и ActionScript AFAIK. –

0

окно вспышки, вероятно, не имеют свою собственную ручку, так как он встроен в веб-страницу. Вы хотите отправить сообщение в окно веб-браузера (это то, что сделал г-н К.).

Если это не сработает для вас, единственной возможностью, которую я знаю, является получение контроля над браузером через WebDriver или WatiN и взаимодействие с объектом Flash с использованием javascript.

8

На самом деле флеш-окно имеет свою собственную ручку.Чтобы получить его, вы должны получить имена классов элементов управления он встроен в от 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; 
     } 
    } 

Надеется, что это было полезно

0

для вызова функции в флэш-объекта и может использовать этот код

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

для получения дополнительной информации по этой ссылке: communicate-betwen-c-and-an-embeded-flash-application

я попробовать его на флэш-объектов в моей форме приложения и работать, но я не использовал его для webbrowser

 Смежные вопросы

  • Нет связанных вопросов^_^