WindowsAPI查找flash句柄问题

rcom10002 2012-07-18 08:08:09

我用下面的代码获取WebBrowser中的flash句柄,如果访问地址是“http://v.youku.com/v_show/id_XNDI4NjE4Mzk2.html”的话,代码工作正常,可以正确地返回宽和高。但如果是访问QQ游戏“http://user.qzone.qq.com/25907516/infocenter#!app=607”,获取的flash句柄对应的宽和高就是“1*1”,不是真实的宽和高。这两个地址的差别在于,优酷flash插件是直接写在HTML里的,而QQ游戏是通过HTML中的iframe嵌套进来。



private static string IES_CLASS_NAME = "Internet Explorer_Server";
private static IntPtr IES_CLASS_NAME_HWND = IntPtr.Zero;
private static string MMFPAX_CLASS_NAME = "MacromediaFlashPlayerActiveX";
private static IntPtr MMFPAX_CLASS_NAME_HWND = IntPtr.Zero;


private void btnInjectPlugin_Click(object sender, EventArgs e)
{
User32.EnumChildWindows(this.browserClient.Handle, EnumChildWindowsCallBack, IntPtr.Zero);
if (!IntPtr.Zero.Equals(IES_CLASS_NAME_HWND))
{
this.log("IES_CLASS_NAME_HWND is not null!");
//User32.EnumChildWindows(IES_CLASS_NAME_HWND, EnumChildWindowsCallBack, IntPtr.Zero);
MMFPAX_CLASS_NAME_HWND = User32.FindWindowEx(IES_CLASS_NAME_HWND, IntPtr.Zero, MMFPAX_CLASS_NAME, null);


while (!IntPtr.Zero.Equals(MMFPAX_CLASS_NAME_HWND))
{
StringBuilder className = new StringBuilder(100);
StringBuilder windowsName = new StringBuilder(100);
User32.GetClassName(MMFPAX_CLASS_NAME_HWND, className, className.Capacity);
User32.GetWindowText(MMFPAX_CLASS_NAME_HWND, windowsName, windowsName.Capacity);
RECT winRect = new RECT();
User32.GetWindowRect(MMFPAX_CLASS_NAME_HWND, ref winRect);
RECT cltRect = new RECT();
User32.GetClientRect(MMFPAX_CLASS_NAME_HWND, out cltRect);

INSTANCE.log("Handle:" + MMFPAX_CLASS_NAME_HWND + "|windowsname:" + windowsName + "|classname:" + className + "|width:" + (winRect.right - winRect.left) + "/" + (cltRect.right - cltRect.left) + "|height:" + (winRect.bottom - winRect.top) + "/" + (cltRect.bottom - cltRect.top));
if (winRect.right - winRect.left > 400)
{
break;
}
MMFPAX_CLASS_NAME_HWND = User32.FindWindowEx(IES_CLASS_NAME_HWND, MMFPAX_CLASS_NAME_HWND, MMFPAX_CLASS_NAME, null);
}
}
User32.PostMessage(MMFPAX_CLASS_NAME_HWND, (uint)MouseMessages.WM_RBUTTONDOWN, IntPtr.Zero, (IntPtr)((0 << 16) | (0 & 0xffff)));
User32.PostMessage(MMFPAX_CLASS_NAME_HWND, (uint)MouseMessages.WM_RBUTTONUP, IntPtr.Zero, (IntPtr)((0 << 16) | (0 & 0xffff)));
}



日志输出内容为:
2012-07-18 8:01:47 :: Handle:330018|windowsname:|classname:MacromediaFlashPlayerActiveX|width:1/1|height:1/1
2012-07-18 8:01:47 :: IES_CLASS_NAME_HWND is not null!
2012-07-18 8:01:47 :: Handle:330018|windowsname:|classname:MacromediaFlashPlayerActiveX|width:1|height:1
2012-07-18 8:01:47 :: Handle:461064|windowsname:|classname:Internet Explorer_Server|width:1680|height:838
2012-07-18 8:01:47 :: Handle:1050662|windowsname:|classname:Shell DocObject View|width:1680|height:838

...全文
371 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rcom10002 2012-07-22
  • 打赏
  • 举报
回复
UP一下,继续等
rcom10002 2012-07-18
  • 打赏
  • 举报
回复
PS:WebBrowser里的HTML元素能用API枚举,EnumChildWindows不好用?我现在只是用WebBrowser里的Document操作。
rcom10002 2012-07-18
  • 打赏
  • 举报
回复
代码结果和Spy++里显示的完全一样,里面只有一个MacromediaFlashPlayerActiveX句柄,宽高一个像素。
bdmh 2012-07-18
  • 打赏
  • 举报
回复
如果是iframe嵌套,你是不是需要对 iframe中的组件继续枚举

111,132

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧