mouseUp и mouseMove вне приложения?

Я пытаюсь реализовать очень простой способ выбора части экрана с помощью мыши. Рабочий процесс является стандартным для многих приложений - нажмите на начальную точку, переместите мышь и обновите прозрачный прямоугольник между нажатой первой точкой и текущей позицией мыши. Базовый код выглядит примерно так (без графики, которая проста)

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" mouseDown="application1_mouseDownHandler(event)">

    <fx:Script>
        <![CDATA[
            import spark.components.mediaClasses.VolumeBar;

            private var _anchorPoint:Point = new Point();
            private var _currentPoint:Point = new Point();

            protected function application1_mouseDownHandler(event:MouseEvent):void
            {
                addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
                addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
                _anchorPoint = new Point(event.stageX, event.stageY);   
            }

            private function handleMouseMove(e:MouseEvent):void
            {
                _currentPoint.x = e.stageX;
                _currentPoint.y = e.stageY;
                trace("rectangle between (",_anchorPoint.x, ",", _anchorPoint.y, ") and (", _currentPoint.x, ",", _currentPoint.y, ").");
            }

            private function handleMouseUp(e:MouseEvent):void
            {
                removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
                removeEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
            }
        ]]>
    </fx:Script>
</s:Application>

Это ломается, когда пользователь перемещает мышь за пределы приложения. Не только _currentPoint прекращает обновление, но также, если вы отпускаете кнопку мыши за пределами приложения, вы пропускаете событие mouseUp, т. Е. Когда вы перемещаете мышь назад в приложение, _currentPoint снова начинает обновление, как если бы вы никогда не отпускали кнопку мыши., Интересно, есть ли способ во Flex (для веб-приложений) обойти это, прослушивая события mouseMove и mouseUp, когда они находятся вне приложения (если это возможно), или каким-либо другим способом, который может иметь смысл.

Спасибо за помощь!

3 ответа

Решение

Вот что большинство людей не знают: MouseEvents отслеживаются за пределами окна приложения, если сработало событие MOUSE_DOWN, но не MOUSE_UP. Вы можете захватывать позиции мыши за пределами окна приложения (и даже за пределами окна браузера) до тех пор, пока все, что вы делаете, заставляет пользователя удерживать свою мышь нажатой. Чтобы проверить это, попробуйте выполнить следующий код:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx"
           creationComplete="init()">
<fx:Script>
    <![CDATA[
        protected function init():void {
            addEventListener(Event.ADDED_TO_STAGE, magic)
        }

        protected function magic(e:Event):void {
            stage.addEventListener(MouseEvent.MOUSE_MOVE, moreMagic);
        }

        protected function moreMagic(e:MouseEvent):void {
            magicalButton.label = "Hold me down! " + String(e.stageX) + "x" + String(e.stageY);
        }
    ]]>
</fx:Script>    
<s:Button id="magicalButton" label="Hold me down!"/>

Это может быть возможно при некотором взломе в AIR, но определенно не при веб-приложении, открытом в браузере.

Только представьте, что произойдет, если веб-сайты смогут отслеживать вашу мышь вне браузера и делать снимки экрана вашей ОС!

Хотя это не приведет вас туда, куда вы хотите, вы можете использовать Event.MOUSE_LEAVE а также MouseEvent.MOUSE_MOVE события для отслеживания того, находится ли курсор в границах приложения.

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