Найти дескриптор пользовательского элемента управления ActiveX внутри IE - PullRequest
0 голосов
/ 27 октября 2011

Как программно найти дескриптор пользовательского элемента управления на веб-странице, работающей в IE?

Я могу найти его с помощью Spy ++, но, поскольку дескриптор постоянно меняется, я застрял.

Я пытался использовать FindWindow (), но не повезло :( Мне также интересно, если я делаю что-то не так, или это просто работает только для Windows ...

Заранее спасибо,

Zubrowka

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Если элемент управления ActiveX является оконным, вы можете запросить его интерфейс IOleWindow, чтобы получить дескриптор окна.

Прежде чем вы запрашиваете интерфейсы из ActiveX , вам необходимо просмотреть HTML-код страницы, чтобы найти способ идентифицировать activex в документе, например идентификатор элемента.

1 голос
/ 27 октября 2011

У меня была похожая проблема с поиском элемента управления ActiveX PDF внутри элемента управления IE в WPF.

Чтобы преодолеть проблему, я использовал API EnumChildWindows, чтобы найти правильное дочернее окно и получить его дескриптор.

Я включу столько кода, сколько смогу.

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

переписано в спешке, поэтому я надеюсь, что это и полезно, и точно.

...