Могу ли я перечислить вкладки HWND "MozillaWindowClass" через XPCOM?

IE обеспечивает легкий доступ к IWebBrowser2 а также IHtmlDocument2 из HWND кадра IE. Так что вы EnumWindows а также EnumChildWindows а затем вы тестируете класс и, как только вы найдете правильные, вы можете легко взаимодействовать с ними.

Если есть способ перечислить все открытые вкладки Mozilla Firefox в "MozillaWindowClass" (имея его HWND ) через XPCOM а C++?

Я гуглил долго и сильно, но не могу найти много на эту тему. Я не хочу разрабатывать расширение / надстройку, но хочу управлять браузером извне из несвязанного EXE, а не из DLL расширения. Или, по крайней мере, какой-то доступ только для чтения к нему.

1 ответ

Решение

Вы не можете использовать C++/XPCOM с Firefox извне, как вы используете COM с IE, вы можете использовать C++/XPCOM только из двоичного компонента вашего расширения. Таким образом, вы не сможете сделать это без написания расширения, и в этот момент легче прослушивать события табуляции из JS и уведомлять ваш двоичный компонент.

Обратите внимание, что поддержка бинарных компонентов в FF - это PITA, поэтому я не советую вам идти по этому пути без веской причины.

Однако, если у вас есть расширение и двоичный компонент, способ получить HWND из вкладки заключается в следующем (надеюсь, что он все еще работает, мы прекратили поддерживать FF во многих версиях назад):

static HWND GetWndHandle(nsIXULWindow * window) {
    HWND hwnd = NULL;

    nsCOMPtr<nsIDocShell> docshell;
    nsresult res = window->GetDocShell(getter_AddRefs(docshell));

    if(NS_SUCCEEDED(res)) {
        nsCOMPtr<nsIBaseWindow> basewnd(do_QueryInterface(docshell));

        if(basewnd) {
            res = basewnd->GetParentNativeWindow((nativeWindow*)&hwnd);
            if(NS_FAILED(res)) hwnd = NULL;
        }
    }

    return hwnd;
}

С этим и уведомлениями от JS ваш двоичный компонент может обеспечить поиск вкладки HWND и что-то с ней делать.

Другие вопросы по тегам