У меня есть расширение firefox, которое должно получить точные координаты экрана элемента DOM и передать его в собственную DLL через js / c-types.
Теперь у меня это в основном покрыто:
var gDomWindowUtils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(nsIDOMWindowUtils);
function getScreenRect(oElem)
{
var rc =
{
x : 0,
y : 0,
w : 0,
h : 0
};
var o = oElement;
while(o != null)
{
rc.y += o.offsetTop;
rc.x += o.offsetLeft;
o = o.offsetParent;
}
var x = {}, y = {};
gDomWindowUtils.getScrollXY(false, x, y);
rc.x -= x.value;
rc.y -= y.value;
var scale = gDomWindowUtils.screenPixelsPerCSSPixel;
rc.x *= scale;
rc.y *= scale;
rc.w *= scale;
rc.h *= scale;
return rc;
};
Это обрабатывает прокрутку и масштабирование, но значения, которые я получаю, относятся к окну браузера, а не к экрану.
Как определить смещение клиентской области реальной области рендеринга браузера?
Я даже могу использовать нативный код (Win32) через js / ctypes, поэтому я попытался выяснить, могу ли я использовать FindWindow () / GetWindowRect (), чтобы получить его, но весь firefox - это один HWND, все элементы управления не являются нативными окнами .
Итак, у меня есть одна идея: поскольку пользовательский интерфейс Firefox является XUL-документом, я должен быть в состоянии получить строку меню, панель вкладок и т. Д. И т. Д. И найти абсолютное смещение областей браузера. Но я понятия не имею, как получить доступ к дереву XUL, которое определяет пользовательский интерфейс браузера.
Может кто-нибудь дать мне указатель?
[Изменить]
Игнорируйте, что rc.w и rc.h не определены в приведенном выше коде, это не имеет отношения к вопросу.