打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用AAUTO语言开发的云桌面登录客户端

AAUTO是一个国产小众语言,和lua算是近亲,官方网站 www.aau.cn

使用aauto的优点我认为对于我来说最主要的有以下两点:

1.无需臃肿的框架类似.NET FRAMEWORK、Adobe AIR等便可开发出小巧而实用的windows程序

2.支持HTMLLAYOUT,对于原来熟悉html+css的web开发者来说是个福音,降低了学习成本

废话不多说了,下面开始介绍下我使用aauto这个短小精悍的语言所开发的访问使用CloudStack所创建的虚拟机的云桌面访问客户端。

界面演示

实现功能

该客户端在输入用户名密码验证登录成功后

1.屏蔽了windows,ALT+F4 以禁止用户返回原生桌面或关闭当前程序(其实屏蔽ALT+F4)

架构详解

下图是该项目的全部文件目录树。

该客户端仅有一个主窗体文件main.aau,界面演示图中的效果是有layout中的index.html实现。sys.ini中配置保存的用户名及登录验证服务网址.

代码详解

main.aau中核心代码如下:

import win.ui;

import win.ui.menu;

import win.ui.atom;

import win.timer;

import inet.whttp;

import web.layout;

import web.layout.behavior.windowCommand;

import fsys.ini;

import sys;

import win.reg;

import key;

import crypt.des;

import crypt.bin;

_ver = "1.1.0 build 20141017"

    //常量定义

_APP_NAME = "clouddesktop"

mainForm = win.form(text = "云桌面登录客户端"; right = 0; bottom = 0; border = "none"; max = false; min = false; maxmize = 1)

var debug = (_STUDIO_INVOKED ? true : false)

var des = crypt.des();

des.setPassword("huiyou");

if (!debug) {

    win.setTopmost(mainForm.hwnd)

}

/*------------------ 公用函数 -------------------*/

function decrypt(str) {

    var rtn = crypt.bin.decodeBase64(str);

    return des.decrypt(rtn);

}

function encrypt(str) {

        var rtn = des.encrypt(str);

        return crypt.bin.encodeBase64(rtn);

    }

    /*------------------ 公用函数 END -------------------*/

    //win.setTopmost(mainForm.hwnd)

var atom, hwnd /*冲突窗口的句柄,该函数会自动激活此窗口*/ = mainForm.atom("BB84EAAE-004C-4AF7-8087-98550285C32E");

if (!atom) {

    /*为窗口设置原子值可以避免一个程序重复运行多个实例*/

    win.quitMessage();

    return;

}

var ini = fsys.ini("/sys.ini")

//1.禁用任务管理器

var reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System")

reg.setDwValue("DisableTaskMgr", 1)

var binpath = io._exepath;

var displayname = "云桌面客户端"

var description = "云桌面客户端"

    /*自动启动*/

reg = win.reg("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run")

reg.setSzValue(_APP_NAME, binpath)

    //reg.delKeyTree("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\clouddesktop")

    //禁用运行

reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer")

reg.setDwValue("DisallowRun", 1)

wbLayout = web.layout(mainForm)

    //禁止窗体绘制默认背景,避免不必要的闪烁

mainForm.onEraseBkgnd = function (hwnd, message, wParam, lParam) {

    return 0;

}

wbLayout.go("/layout/index.html");

//----------------屏蔽按键

import key.hook;

hk = key.hook()

hk.proc = function (msg, vkcode, scancode, injected, flags, timeStamp, extraInfo) {

    if (injected) return;

    var kn = key.getName(vkcode);

    select(msg) {

    case 0x100 /*_WM_KEYDOWN*/ , 0x104 /*_WM_SYSKEYDOWN*/ {

        if (kn == "LWIN" || kn == "RWIN" || ((flags & 0x20 /*_LLKHF_ALTDOWN*/ ) != 0 && kn == "F4")) {

            return true

        }

        elseif(kn == "0" && key.getStateX("CTRL")) {

            reg.close();

            win.quitMessage();

        }

    }

    }

}

//----------------屏蔽按键END

timer = win.timer(mainForm);

quit = function () {

    hk.close();

    timer.disable();

    reg.close();

    win.quitMessage();

}

_section_AutoLogin = "autologin"

var isAutoLogin = false;

if (ini.readKeys(_section_AutoLogin)) {

    sec = ini.getSection(_section_AutoLogin)

    rememberUserName = sec.rememberUserName //记住用户名

        //autoLogin=sec.autoLogin

}

if (rememberUserName == "1") {

    wbLayout.getEle("cbxRemember").value = true

    wbLayout.getEle("username").value = decrypt(sec.userName)

}

/*

if(autoLogin=="1"){

isAutoLogin=true;

wbLayout.getEle("userpass").value = sec.userPass;

wbLayout.getEle("cbxAutoLogin").value = true

wbLayout.getEle("btnSmt").click()

}

*/

var http = inet.whttp();

//请求服务baseurl,可用用户名

var serverBaseUrl = ini.read("server", "url", "http://140.28.22.122:8080/admin/getvm");

if (false == string.startWith(serverBaseUrl, "http://")) {

    serverBaseUrl = decrypt(serverBaseUrl);

}

wbLayout.onButtonClick = function (ltTarget, ltEle, reason, behaviorParams) {

    if (ltEle.id == "btnSmt") {

        var username = wbLayout.getEle("username").value;

        var password = wbLayout.getEle("password").value;

        rememberUserName = wbLayout.getEle("cbxRemember").value;

        //autoLogin=wbLayout.getEle("cbxAutoLogin").value;

        if (username == "用户名") username = "t1"

        if (!#password || password == "密码") password = "t1"

        if (!#username) {

            mainForm.msgbox("请输入用户名") return;

        }

        if (!#password) {

            mainForm.msgbox("请输入密码") return;

        }

        var url = string.concat(serverBaseUrl, "?command=getsvm&username=", username, "&password=", password);

        var str;

        try {

            str = http.get(url)

        } catch (e) {

            mainForm.msgbox("无法连接到远程服务,请检查远程服务是否可访问");

            return;

        }

        if (null == str || !#str) {

            mainForm.msgbox("登录失败,请检查网络连接情况并稍后再试");

            return

        }

        if (str == "1") {

            mainForm.msgbox("登录失败,请检查用户名密码是否正确");

            return

        }

        //------------ 保存用户名密码等到配置文件

        /*保存用户名密码等到配置文件{{*/

        ini.write(_section_AutoLogin, "rememberUserName", rememberUserName ? 1 : 0)

            //ini.write(_section_AutoLogin,"autoLogin",autoLogin?1:0)

        if (rememberUserName) {

            var sUserName = des.encrypt(username);

            ini.write(_section_AutoLogin, "userName", crypt.bin.encodeBase64(sUserName));

        }

        /*

if(autoLogin){

ini.write(_section_AutoLogin,"userPass",password)

}

*/

        /*}}*/

        //------------ 保存用户名密码等到配置文件 END

        if (isAutoLogin) {

            ltEle.value = "登陆中...";

        }

        var arr = string.split(str, '$')

        userid = arr[1];

        var serverip = arr[2];

        var port = arr[3];

        var vmUserName = arr[4];

        var vmpwd = arr[5];

        var desktopUrl = arr[6];

        //-------------- 远程连接start

        import com.lite;

        rdpClient = com.lite("MsTscAx.dll").createEmbed(mainForm, "{7cacbd7b-0d99-468f-ac33-22e495c0afe5}")

        msTscAx = rdpClient._object; //获取控件对象

        //响应远程桌面事件

        rdpClient.OnDisconnected = function (discReason) {

            //mainForm.msgbox(discReason)

            select(discReason) {

            case 1, 2 {

                quit();

                if (!debug) sys.shutdown();

            }

            }

        }

        //设置远程登录参数

        msTscAx.Server = serverip;

        msTscAx.UserName = vmUserName;

        msTscAx.AdvancedSettings2.ClearTextPassword = vmpwd;

        msTscAx.AdvancedSettings2.RDPPort = port; //端口

        msTscAx.AdvancedSettings2.RedirectPrinters = true; //共享打印

        msTscAx.AdvancedSettings2.RedirectDrives = true; //允许共享磁盘

        msTscAx.AdvancedSettings2.RedirectDynamicDrives = true;

        msTscAx.AdvancedSettings2.SmartSizing = true; //自动调整大小

        msTscAx.AdvancedSettings2.DisplayConnectionBar = true;

        msTscAx.AdvancedSettings2.DisableCtrlAltDel = 1;

        msTscAx.AdvancedSettings2.EnableWindowsKey = 0;

        //msTscAx.AdvancedSettings.Compress=1;

        //msTscAx.AdvancedSettings.BitmapPeristence = 1;// 将位图缓存到磁盘

        //msTscAx.SecuredSettings2.StartProgram = "c:\browser.exe "++ desktopUrl;

        msTscAx.FullScreen = false; //是否全

        msTscAx.FullScreenTitle = mainForm.text; //全屏标题

        msTscAx.ColorDepth = 32; //32位颜色

        msTscAx.ConnectingText = "欢迎使用云桌面,正在连接,请稍候......"

        msTscAx.Connect(); //连接

        //-------------- 远程连接 END

        //加载计时器

        timer.enable();

        timer.setInterval(120000) //2分钟发送一次heartbeat

    }

}

var elePwd = wbLayout.getEle("userpass")

elePwd.onKeyUp = function (ltTarget, ltOwner, keyCode, altState, ltKeyParams) {

    if (ltOwner.id == "userpass" && keyCode == 13) {

        wbLayout.getEle("btnSmt").click()

    }

}

elePwd.attachEventHandler()

//发送heartbeat

timer.onTimer = function (hwnd, msg, id, tick) {

    if (!userid || !#userid) return;

    var url = string.concat(serverBaseUrl, "?command=heartbeat&userid=", userid);

    http.get(url);

}

mainForm.onClose = function (hwnd, message, wParam, lParam) {

    return false;

    if (#userid) {

        var url = string.concat(serverBaseUrl, "?command=logout&userid=", userid);

        http.get(url);

        http.close()

    }

    process.kill("mstsc.exe")

    quit();

    collectgarbage("collect"); //内存回收,确保完全退出

    if (!debug) sys.shutdown();

}

//响应窗口事件

mainForm.wndproc = function (hwnd, message, wparam, lparam) {

        select(message) { //判断消息类型

        case 0x10 /*_WM_CLOSE*/ {

            return true; //阻止关闭

        };

        case 0x282 {

            import winex;

            var winHwnd, ch, tid, pid = winex.findExists("<云桌面登录客户端>", "", "<AAU_FORM[\S+]>", "<ATL:\w+>")

            if (ch != null) {

                rdpClient._host.doObjectVerb(-5)

            }

        };

        }

    } //endproc

mainForm.show()

    //import cloudDesktop.common;

    //cloudDesktop.common.checkUpdate();

win.loopMessage();

sys.ini中内容

[autologin]
userName=7JB75wW03kA=
rememberUserName=1

[server]
url=http://xxxxxx/admin/getvm

转载于:https://www.cnblogs.com/s1ihome/p/4099496.html

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
rdp delphi实现远程桌面
文件夹怎么加密
​用户自动登录 lightdm
PHP漏洞函数总结
如何部署使用“远程桌面Web连接”
aardio读取一个ip列表的txt文件,将ip添加到列表中,ping通的显示蓝色,不通的显示..
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服