在IE中查找ActiveX用户控件的句柄

本文关键字:控件 句柄 用户 ActiveX IE 查找 | 更新日期: 2023-09-27 18:12:47

如何以编程方式在IE上运行的网页中找到用户控件的句柄?

我可以使用spy++找到它,但由于手柄不断变化,我被卡住了。

我一直在尝试使用FindWindow(),但没有运气:(我也想知道我是否做错了什么,或者它只是为Windows工作…

提前感谢,

Zubrowka

在IE中查找ActiveX用户控件的句柄

我在WPF的IE控件中找到PDF ActiveX控件时遇到了类似的问题。

为了克服这个问题,我使用EnumChildWindows API来找到正确的子窗口,从而获得其句柄。

我将尽可能多地包含代码。

private static IntPtr FindPdfControlWindow(IntPtr parentHandle)
{
    IntPtr result = IntPtr.Zero;
    IntPtr matchPointer = IntPtr.Zero;
    try
    {
        //allocate unmanaged memory for the result of the callback delegate
        matchPointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
        Marshal.WriteIntPtr(matchPointer, IntPtr.Zero)
        //instantiate the delegate and pass to the API
        NativeMethods.EnumWindowProc windowChecker = CheckForPdfControlWindow;
        if (!NativeMethods.EnumChildWindows(parentHandle, 
                                                windowChecker, 
                                                matchPointer))
    }
    finally
    {
        if (matchPointer != IntPtr.Zero) Marshal.FreeHGlobal(matchPointer);
    }
    return result;
}
private static bool CheckForPdfControlWindow(IntPtr handle,
                                                IntPtr matchPointer)
{
    int captionLength = NativeMehtods.GetWindowTextLength(handle);
    if (captionLength > 0)
    {
        StringBuilder buffer = new StringBuilder(captionLength + 1);
        NativeMethods.GetWindowText(handle, buffer, buffer.Capacity);
        if (buffer.ToString().Contains("Adobe"))
        {
            Marhsal.WriteIntPtr(matchPointer, handle)
            return false;
        }
    }
    return true;
}
private static class NativeMethods
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool EnumChildWindows(IntPtr window,
                                                    EnumWindowProc callback,
                                                    IntPtr i);
    internal delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSer.Auto)]
    internal static extern int GetWindowTextLength(IntPtr hWnd);
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    internal static extern int GetWindowText(IntPtr hWnd,
                                               StringBuilder lpString,
                                               int nMaxCount);
}

是匆忙誊写的,所以我希望它既有用又准确。

如果ActiveX控件是有窗口的,那么您可以查询它的IOleWindow接口来获取窗口句柄。

在从ActiveX查询接口之前,您需要查看页面的HTML,以找到一种在文档中识别ActiveX的方法,例如元素id。