Вопрос по c# – Как отправить сообщение на флэш-окно, встроенное в WebBrowser?

4

Хотелось бы узнать, есть ли способ заблокировать окно Flash и опубликовать в нем сообщение? У другого человека здесь был ответ, его зовут Спенсер К. Его вопрос был: Отправка симулированного клика через WebBrowser в C # для прошивки объекта, встроенного в HTML

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

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

РЕДАКТИРОВАТЬ: Я только что решил вставить SWF-объект в мою форму и опубликовать сообщения для обработки этого.

Ваш Ответ

4   ответа
0

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

для получения дополнительной информации перейдите по этой ссылке:сообщаться-betwen-с-и-ан-Embeded-флэш-приложение

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

1

Импортируйте это:

import flash.external.ExternalInterface;

Добавьте это в свой код AS:

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

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

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

jsObject.jsFunction("message");

Это функция для получения объекта js объекта flash:

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

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

edit: добавлена функция js для получения объекта js

Error: User Rate Limit Exceeded Jc Gurango
Error: User Rate Limit Exceededjodieorourke.com/view.php?id=122&blog=news.
0

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

Если это не работает для вас, единственная другая опция, о которой я знаю, - это получить контроль над браузером через WebDriver или WatiN и взаимодействовать с флеш-объектом с помощью 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;
        }
    }

Надеюсь, это было полезно

Похожие вопросы