• [AIR] 利用SnapShot.exe实现QQ截屏功能


    主类(可作文档类):

    package
    {
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.events.MouseEvent;
        import flash.text.TextField;
        
        /**
         * @author: Frost.Yen
         * @E-mail: 871979853@qq.com
         * @create: 2016-5-6 上午9:57:53
         *
         */
        [SWF(width="800",height="600")]
        public class ScreenShot extends Sprite
        {
            private var _snapShot:SnapShot;
            private var _button:TextField;
            private var _text:TextField;
            private var _container:Sprite;
            public function ScreenShot()
            {
                _container = new Sprite();
                _button = textButton("   click me to shot!   ");
                _text = textButton("   CTRL+ALT+A 也可以截屏   ");
                _snapShot = new SnapShot();
                _button.x = stage.stageWidth-_button.width-10;
                _button.y = stage.stageHeight-_button.height-10;
                _text.x = _button.x - _text.width - 10;
                _text.y = _button.y;
                _snapShot.addEventListener(Event.COMPLETE,onShotComplete);
                _button.addEventListener(MouseEvent.CLICK,onShot);
                this.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
                this.addChild(_container);
                this.addChild(_button);
                this.addChild(_text);
            }
            private function onShot(e:MouseEvent):void
            {
                _snapShot.start();
            }
            private function onShotComplete(e:Event):void
            {
                if(_container.numChildren){
                    (_container.getChildAt(0) as Bitmap).bitmapData.dispose();
                    _container.removeChildAt(0);
                }
                _container.addChild(_snapShot.bitmap);
            }
            private function onKeyDown(e:KeyboardEvent):void
            {
                if (e.altKey && e.ctrlKey && e.keyCode == 65) {
                    _snapShot.start();
                }
            }
            private function textButton(text:String=""):TextField
            {
                var button:TextField = new TextField();
                button.autoSize = "center";
                button.text = text;
                button.selectable = false;
                button.border = true;
                return button;
            }
        }
    }

    用于截屏的类

    package
    {
        import flash.desktop.Clipboard;
        import flash.desktop.ClipboardFormats;
        import flash.desktop.NativeProcess;
        import flash.desktop.NativeProcessStartupInfo;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IEventDispatcher;
        import flash.events.NativeProcessExitEvent;
        import flash.filesystem.File;
        
        /**
         * @author: Frost.Yen
         * @E-mail: 871979853@qq.com
         * @create: 2016-5-6 上午10:00:29
         * 截屏后生成图片
         */
        public class SnapShot extends EventDispatcher
        {
            private var _file:File;
            private var _nativeProcessStartupInfo:NativeProcessStartupInfo;
            private var _nativeProgress:NativeProcess;
            private var _bitmapData:BitmapData;
            private var _bitmap:Bitmap;
            private var _completeEvent:Event;
            public function SnapShot(target:IEventDispatcher=null)
            {
                super(target);
                _file = File.applicationDirectory.resolvePath("ExtendApplication/SnapShot.exe");
                
                /**
                 * 此类提供了用于启动主机操作系统上的进程的基本信息。构建该类并将其传递给 NativeProcess 对象的 start() 方法。
                 */
                _nativeProcessStartupInfo = new NativeProcessStartupInfo();
                
                /**
                 * 如果指定的值是 null、如果它引用一个目录或引用一个不存在的文件。
                 */
                _nativeProcessStartupInfo.executable = _file;
                
                /**
                 * NativeProcess 类提供命令行集成和常规启动功能。
                 * NativeProcess 类允许 AIR 应用程序在主机操作系统上执行本机进程。
                 * AIR 应用程序可以监视进程的标准输入 (stdin) 和标准输出 (stdout) 流以及进程的标准错误 (stderr) 流。
                 */
                _nativeProgress = new NativeProcess();
                _completeEvent = new Event(Event.COMPLETE);
            }
            public function start():void
            {
                /**
                 *启动由指定的启动信息标识的本机进程。进程启动后,所有输入流和输出流将打开。
                 * 在请求操作系统启动指定的进程后,此方法将立即返回。如果进程当前正在运行,
                 * NativeProcess 对象会引发 IllegalOperationError 异常。如果 NativeProcess 
                 * 对象的 running 属性返回 true,则表示此进程正在运行。如果操作系统无法启动进程,
                 * 会引发 Error。 
                 */
                _nativeProgress.start(_nativeProcessStartupInfo);
                /**
                 * 退出进程时,由 NativeProcess 对象调度此事件。可能会永不调度此事件。例如,
                 * 如果子进程的运行时间比创建它的 AIR 应用程序运行时间长,则不会调度此事件。
                 */
                _nativeProgress.addEventListener(NativeProcessExitEvent.EXIT,onExit); 
                
            }
            private function onExit(e:NativeProcessExitEvent):void
            {
                if (Clipboard.generalClipboard.hasFormat(ClipboardFormats.BITMAP_FORMAT))
                {
                    _bitmapData = Clipboard.generalClipboard.getData(ClipboardFormats.BITMAP_FORMAT) as BitmapData;
                    _bitmap = new Bitmap(_bitmapData);
                    dispatchEvent(_completeEvent);
                }
            }
            public function get bitmap():Bitmap
            {
                return _bitmap;
            }
        }
    }

    注意:

    在工程的配置 工程名称-app.xml上加上如下代码
    <supportedProfiles>extendedDesktop</supportedProfiles>
    添加的位置可以为如下:
    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <application xmlns="http://ns.adobe.com/air/application/17.0">
    <supportedProfiles>extendedDesktop</supportedProfiles>

  • 相关阅读:
    30 Day Challenge Day 11 | Leetcode 55. Jump Game
    30 Day Challenge Day 11 | Leetcode 11. Container With Most Water
    30 Day Challenge Day 10 | Leetcode 701. Insert into a Binary Search Tree
    30 Day Challenge Day 10 | Leetcode 1. Two Sum
    30 Day Challenge Day 10 | Leetcode 3. Longest Substring Without Repeating Characters
    30 Day Challenge Day 9 | Leetcode 425. Word Squares
    30 Day Challenge Day 8 | Leetcode 200. Number of Islands
    30 Day Challenge Day 7 | Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    30 Day Challenge Day 7 | Hackerrank: Tree: Huffman Decoding
    30 Day Challenge Day 6 | Leetcode 92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/frost-yen/p/5464843.html
Copyright © 2020-2023  润新知