4

Flash ウィンドウにロックしてメッセージを投稿する方法があれば教えてください。彼の名前はスペンサー K です。彼の質問は次のとおりです 。HTML に埋め込まれたオブジェクトをフラッシュするために、C# の WebBrowser 経由でシミュレートされたクリックを送信する

残念ながら、K氏はあまり具体的ではなく、質問を読んでいる人々に残したのは、「ハンドルを取得し、ハンドルを反復処理した」ということだけでした。彼がそれによって何を意味したのか、私にはよくわかりません。EnumWindows を使用してすべての可視ハンドルを反復処理しましたが、フラッシュ ウィンドウであるウィンドウが返されなかったため、役に立ちませんでした。

この数日間、私は頭がおかしくなっているので、ここにいる誰かが私に教えてくれることを願っています.

編集: SWF オブジェクトをフォームに挿入し、そのハンドルにメッセージを投稿することにしました。

4

4 に答える 4

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;
        }
    }

これが役に立ったことを願っています

于 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 {
}

フラッシュ オブジェクトの 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

フラッシュオブジェクトの関数を呼び出すために、uはこのコードを使用できます

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

詳細については、次のリンクをたどってください:communication-betwen-c-and-an-embeded-flash-application

フォームアプリケーションのフラッシュオブジェクトで試してみましたが、動作しましたが、Webブラウザでは使用しませんでした

于 2012-06-22T18:02:56.473 に答える
0

Flash ウィンドウは Web ページに埋め込まれているため、おそらく独自のハンドルはありません。メッセージを Web ブラウザー ウィンドウに投稿する必要があります (K 氏はそうしました)。

それがうまくいかない場合、私が知っている唯一の他のオプションは、WebDriver または WatiN を介してブラウザーを制御し、javascript を使用してフラッシュ オブジェクトを操作することです。

于 2012-04-17T00:00:40.767 に答える