mouseUp和mouseMove在应用程序之外?

时间:2011-06-06 23:44:54

标签: flex flex4

我正在尝试通过鼠标实现一种非常简单的方法来选择屏幕的子部分。工作流程是许多应用程序的标准工作流程 - 单击起点,在点击的第一个点和鼠标的当前位置之间移动鼠标和透明矩形更新。基本代码看起来像这样(减去图形,这很简单)

<?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 个答案:

答案 0 :(得分:1)

以下是大多数人不知道的事情:如果触发了MOUSE_DOWN事件,则会在应用程序窗口之外跟踪MouseEvents,而不是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!"/>

答案 1 :(得分:0)

在AIR中可能会遇到一些黑客攻击,但绝对不能在浏览器中打开webapp。

想象一下,如果网站可以在浏览器之外跟踪您的鼠标并能够截取您的操作系统屏幕截图,会发生什么情况!

答案 2 :(得分:0)

虽然这不会让您到达您想要的位置,但您可以使用Event.MOUSE_LEAVEMouseEvent.MOUSE_MOVE事件来跟踪光标是否在应用程序的边界内。