C# - 如何将PostMessage嵌入WebBrowser中嵌入的Flash窗口?

Jc *_*ngo 4 c# browser flash postmessage

我想知道是否有任何方法可以锁定Flash窗口并向其发送消息?这里的另一个人得到了答案,他的名字是Spencer K.他的问题是: 通过C#中的WebBrowser将模拟点击发送到HTML中嵌入的flash对象

不幸的是,K先生并不是非常具体,而且他为阅读他的问题的人留下的只是他"得到了手柄,然后通过手柄迭代".我不太确定他的意思.我使用EnumWindows迭代所有可见的句柄无济于事,因为它没有返回一个闪存窗口的窗口.

我希望有人能告诉我,因为这几天让我发疯了.

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

小智 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;
    }
Run Code Online (Sandbox Code Playgroud)

获得句柄后,您可以发布点击次数:

    [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));            
    }
Run Code Online (Sandbox Code Playgroud)

这些点将相对于客户端,因此当您保存它们时,您应该像这样保存它:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望这有用