У меня есть панель xul: на моем расширении Firefox. Я предоставляю положение для отображения в соответствии с screen.width и screen.height. Моя проблема возникает, когда у меня есть несколько мониторов, и я запускаю браузер на первом мониторе, он появляется на втором, а панель xul: рисуется в соответствии с разрешением первого экрана на втором. Есть ли решение для рисования в соответствии с разрешением второго экрана?xul: положение панели на нескольких мониторах
ответ
фон:
Когда я занимаюсь разработкой приложений многоплатформенного монитора, основанными на XULRunner для работы, я обнаружил, что вы просто не могли предсказать, где оконный менеджер будет размещать окна запущенных после первого запуска ваших главное окно приложения/браузера.
XULRunner сделал правильно дать мне:
- геометрии (ширину, высоту) для полного отображения несколько мониторов
- положения окна для данного окна на дисплее несколько мониторов
- состояния окна (МАКСИМАЛЬНЫЕ, MINIMIZED , ни) для данного окна
- способности (un-) не максимизирует окно
Это не правильно соблюдать геометрию несколько мониторов, когда я Удельный отредактировал набор оконных координат, которые бы поместили окно на конкретный монитор (скорее, оконный менеджер разместил новое окно, где ему было угодно).
Это оставил меня с задачей как-то, выполнив следующие действия:
- позиционирования окна относительно отображения на несколько мониторов, и
(потому что перемещение окна иногда теряет фокус окна) - Фокусировка окна.
Я смог достичь как с помощью внешней DLL, загруженной/используемой js-ctypes.
Пример для Win32:
Вот являются основами для связывания внешних DLL в JavaScript. Этот пример охватывает только Win32, но я также сделал это для Linux и для MacOSX (которые были проще & соответственно по сравнению с Win32).
Есть 3 части:
- Привилегированное код JavaScript для загрузки/свяжи Win32 API,
- Заголовочный файл CPP для нашей внешней DLL
- Исходный файл CPP для нашей внешней DLL
Я создаю простой проект GUI DLL с более поздними двумя файлами & скомпилировал wmctrl.dll
, в зависимости от msvcr100.dll
и использовал Dependency Walker, чтобы найти символы «plain C», экспортируемые th e DLL для использования js-ctypes.
Я также создал библиотеку JavaScript вокруг API-интерфейсов, которые позволили манипулировать, отслеживать & состояние/геометрию состояния для нескольких окон в течение нескольких прогонов приложения, но это не имеет отношения к этому простому примеру.
В привилегированном коде JavaScript:
// get js-ctypes, you do this part a bit differently from browser chrome
const {Cc,Ci,Cu} = require("chrome");
var file=null, lib=null, ctypes = {};
Cu.import("resource://gre/modules/ctypes.jsm", ctypes);
var ctypes = ctypes.ctypes;
// build platform specific library path
var filename = ctypes.libraryName("wmctrl");
var comp = "@mozilla.org/file/directory_service;1";
var file = Cc[comp].getService(Ci.nsIProperties).get("CurProcD", Ci.nsIFile);
file.append("browser_code");
file.append(filename);
// get the JavaScript library interface (load the library)
var lib = ctypes.open(file.path);
// wmctrl_find_window: returing unsigned 32bit (long) "window handle"
// takes string "window title".
var find_window = lib.declare("[email protected]@[email protected]",
ctypes.stdcall_abi, ctypes.uint32_t,
ctypes.char.ptr);
// wmctrl_window_focus: takes unsigned 32bit (long) "window handle".
var window_focus = lib.declare("[email protected]@[email protected]",
ctypes.stdcall_abi, ctypes.void_t,
ctypes.uint32_t);
// wmctrl_window_move: takes unsigned 32bit (long) "window handle",
// and two (x & y) signed 32bit ints.
var window_move = lib.declare("[email protected]@[email protected]",
ctypes.stdcall_abi, ctypes.void_t,
ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t);
wmctrldll.h
#ifdef WMCTRLDLL_EXPORTS
#define WMCTRLDLL_API __declspec(dllexport)
#else
#define WMCTRLDLL_API __declspec(dllimport)
#endif
WMCTRLDLL_API void wmctrl_window_focus (unsigned long wid);
WMCTRLDLL_API void wmctrl_window_move (unsigned long wid, int x, int y);
WMCTRLDLL_API unsigned long wmctrl_find_window(char* find_title);
wmctrldll.cpp
#include "stdafx.h"
#include "wmctrldll.h"
typedef struct {
HWND hWnd;
char title[255];
} myWinSpec;
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
char String[255];
myWinSpec* to_find = (myWinSpec*) lParam;
// not a window
if (!hWnd) return TRUE;
// not visible
if (!IsWindowVisible(hWnd)) return TRUE;
// no window title
if (!GetWindowTextA(hWnd, (LPSTR)String, 255)) return TRUE;
// no title match
if (strcmp(String, to_find->title) != 0) return TRUE;
to_find->hWnd = hWnd;
return FALSE;
}
WMCTRLDLL_API void wmctrl_window_focus(unsigned long wid) {
SetForegroundWindow((HWND) wid);
}
WMCTRLDLL_API unsigned long wmctrl_find_window(char* find_title) {
myWinSpec to_find;
sprintf_s(to_find.title, sizeof(to_find.title), "%s", find_title);
to_find.hWnd = 0;
EnumWindows(EnumWindowsProc, (LPARAM)&to_find);
return (unsigned long) to_find.hWnd;
}
WMCTRLDLL_API void wmctrl_window_move(unsigned long wid, int x, int y) {
UINT flags = SWP_SHOWWINDOW | SWP_NOSIZE;
SetForegroundWindow((HWND) wid);
SetWindowPos((HWND) wid, HWND_NOTOPMOST, x, y, NULL, NULL, flags);
}
- 1. Видео на нескольких мониторах
- 2. Ява нахождение мыши на нескольких мониторах
- 3. Получить позицию курсора на нескольких мониторах?
- 4. Центр Userform на нескольких мониторах
- 5. C# Позиция меню управления на нескольких мониторах
- 6. Управление несколькими окнами на нескольких мониторах
- 7. Полный экран на нескольких мониторах с XNA
- 8. Максимизация окон Adobe Air на нескольких мониторах
- 9. Рисование поверх всех окон на нескольких мониторах
- 10. Как создать панель задач на нескольких мониторах?
- 11. Как увеличить окно на нескольких мониторах?
- 12. Зонирование окон на двух мониторах
- 13. Передача значений в iframe внутри панели xul
- 14. Как создать вторую панель задач для использования на нескольких мониторах?
- 15. Открыть несколько приложений Unity в нескольких мониторах
- 16. Восстановление состояния боковой панели в XUL
- 17. Выполнение цвета фона панели xul до прозрачности
- 18. Открыть приложение XUL без навигационной панели
- 19. Как разместить тень под XUL всплывающей панели
- 20. Есть ли способ использовать PyCharm на нескольких мониторах
- 21. Полный экран на нескольких мониторах с приложениями Chrome
- 22. Как сделать полноэкранный режим GLFW на нескольких мониторах?
- 23. Создание зависимого от окна DeviceContext на нескольких мониторах
- 24. Delphi 7: Расположение центральной формы на нескольких мониторах
- 25. кнопку Положение панели Bootstrap
- 26. Открытие файла xul в ответ на кнопку расширения панели инструментов.
- 27. Firefox XUL: кнопка на панели инструментов Авто загрузка
- 28. Положение JFrame на нескольких экранах
- 29. Полноэкранный просмотр на широкоформатных мониторах
- 30. Различные дисплеи на больших мониторах
Это кровавое месиво, на самом деле! Мне пришлось приостановить разработку приложения на основе XULRunner для работы с управлением окнами. Я закончил использование Win32 или X11 apis (в зависимости от платформы) непосредственно из 'js-ctypes'. В принципе, я бы быстро изменил заголовок окна, чтобы идентифицировать его из кода C++ путем перечисления окон, а затем вернуть его в исходное название и сохранить ссылку на идентифицированное окно для последующего использования с API, которые я подвергал JavaScript, с помощью js -ctypes'. –
Не уверен, что с XULJet что-то улучшилось, или если это вообще применимо к расширениям Firefox. –
Я напишу ответ, но, возможно, кто-то может прослушивать чистое решение для JavaScript :-) –