【问题标题】:mouseUp and mouseMove outside of the application?mouseUp 和 mouseMove 在应用程序之外?
【发布时间】:2011-06-06 23:44:53
【问题描述】:

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

<?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 事件或任何其他可能有意义的方式来解决此问题。

感谢您的帮助!

【问题讨论】:

    标签: apache-flex flex4


    【解决方案1】:

    这是大多数人不知道的:如果触发了 MOUSE_DOWN 事件而不是 MOUSE_UP,则在应用程序窗口之外跟踪 MouseEvents。您可以在应用程序窗口之外(甚至在浏览器窗口之外)抓取鼠标位置只要您所做的任何事情都能让用户按住鼠标。要对此进行测试,请尝试运行以下命令代码:

    <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!"/>
    

    【讨论】:

      【解决方案2】:

      在 AIR 中进行一些黑客攻击可能是可能的,但绝对不能在浏览器中打开 web 应用程序。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          相关资源
          最近更新 更多