Захват событий клавиатуры Adobe Air в новом окне - PullRequest
0 голосов
/ 13 июля 2010

Для меня достаточно важно, что я открываю вопрос до вознаграждения с простой целью: может ли кто-нибудь успешно открыть новое полноэкранное NativeWindow в AJAX Air и из этого окна обнаруживать нажатия клавиш?

Надеюсь, я просто упускаю что-то действительно очень простое, но если JS не способен прослушивать события клавиатуры, возможно, флэш-виджет / помощник сможет передавать события клавиатуры в JS.Это единственное, о чем я могу думать, но могут быть и другие способы.Я просто не знаю.Надеюсь, кто-то знает правильный ответ!


Обновление

Большое спасибо @mwilcox за ответ.Я не знаю, в чем разница между методом, который я использовал (из кулинарной книги О'Рейли) и createRootWindow(), но как бы то ни было, это решило мои проблемы.Код, который я использовал в итоге, таков:

var objWindowOptions = new air.NativeWindowInitOptions();
objWindowOptions.transparent = false;
objWindowOptions.systemChrome = air.NativeWindowSystemChrome.STANDARD;
objWindowOptions.type= air.NativeWindowType.NORMAL;

var linkScreenToMainWindow = function() {
    wWindow.removeEventListener(air.Event.COMPLETE,linkScreenToMainWindow);
    objScreen.setWindowReference(wWindow.stage.getChildAt(0).window);
    // At this point your windows are connected and you can fire commands into
    // the window using objScreen as a proxy. For example:
    alert(objScreen.document.body.innerHTML);
    objScreen.myfunction();
};

var fhFilePath = air.File.applicationDirectory.resolvePath('childwindow.html');

wWindow   = air.HTMLLoader.createRootWindow(true, objWindowOptions, true);
wWindow.stage.displayState = window.runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
wWindow.addEventListener(air.Event.COMPLETE,linkScreenToMainWindow);
wWindow.load(new air.URLRequest(fhFilePath.url));

Я создал новое окно в Adobe Air (JS), и мне нужно захватывать любые нажатия клавиш (или нажатия клавиш, если это проще),У меня нет проблем с добавлением прослушивателя событий в главное окно, но ни одно дочернее окно, похоже, не распознает ни одну из распространенных техник перехвата.

Часть проблемы, я думаю, заключается в том, что первый параметр addEventListener() - это имя события, и все документированные имена событий не могут вызывать какие-либо события.Любая идея, что, как я должен это сделать?

Главное окно

// Keyboard handler and event listener subscription:
var watcher = function() {
    alert("Working");
};
window.addEventListener("keypress",watcher,false); // WORKS!

// Create child window:
var wWindow = new air.NativeWindow(objWindowOptions);
wWindow.activate();

wWindow.stage.displayState = window.runtime.flash.display.StageDisplayState.FULL_SCREEN_INTERACTIVE;
wWindow.stage.scaleMode = "noScale"; 
wWindow.stage.addChild( htmlView ); 
htmlView.load( new air.URLRequest("newpage.html") );

Дочернее окно: newpage.html

// Keyboard handler and event listener subscription
var handler = function() {
    alert('success!');
};
var strEventName = KeyboardEvent.KEY_DOWN; // Fails -- is undefined
//var strEventName = KeyboardEvent.KEYDOWN; // Fails -- is undefined
//var strEventName = 'keydown'; // Fails
// var strEventName = 1024; // Fails

window.nativeWindow.stage.addEventListener(strEventName,handler,false); // Fails
nativeApplication.addEventListener(strEventName,handler,false); // Fails
window.addEventListener(strEventName,handler,false); // Fails

Возможно, я ошибаюсь, но я думаю, что перепробовал каждую перестановку из вышеперечисленного, и ни одна из них не работает.

1 Ответ

1 голос
/ 18 июля 2010

Я думаю, ты пропустил шаг. Попробуйте:

var newWin = air.HTMLLoader.createRootWindow(...options);
var container = newWin.window.nativeWindow;

В противном случае, вы уверены, что AIR загружен в это дочернее окно?

...