javascript不依赖库开发windows应用程序

        其实javascript不仅可以做网页应用,也可以不依赖任何环境开发windows应用程序。windows系统自带mshta.exe,相当于一个javascript虚拟机,我们把.html文件扩展名改成.hta文件,网页就变成了hta应用程序,双击就可以执行。当然hta可以操作本地文件数据库等,功能比html强大许多,可以开发C/S应用程序。本人之前是个后台程序员,后来我转行之后,就成了编程的业余爱好者,今天这个demo使用了javascript和少许c++,仅供大家娱乐,参考,谨慎用于生产环境。

        先给大家上几张图,看一下javascript开发的windows应用效果,然后再上代码。这个demo是个音乐播放器,功能只有扫描磁盘上的音频文件随机播放。

javascript不依赖库开发windows应用程序_第1张图片

javascript不依赖库开发windows应用程序_第2张图片

javascript不依赖库开发windows应用程序_第3张图片

        也有一个搜索功能,搜索随机播放列表中的歌曲,简单的正则匹配

javascript不依赖库开发windows应用程序_第4张图片

        测试发现占用内存和cpu很低。

javascript不依赖库开发windows应用程序_第5张图片

        最后楼主用c++给他做了个exe壳子,这样就能把他设置为默认播放器了,双击音频文件就能用楼主开发的播放器打开,效果如下图

javascript不依赖库开发windows应用程序_第6张图片

大家可能也能看出,我用的html中的

javascript不依赖库开发windows应用程序_第7张图片

        最终软件包含三个文件,app.ico是图标,main.hta就是楼主用javascript开发的windows应用程序,双击就可以打开,main.exe是楼主给他做的壳子,用于双击打开音频文件通过命令行将文件路径传递给main.hta。下面先上main,hta的代码,里面基本上和普通javascript语法相同,只是有一些用到了ActiveX控件的对象。




小小播放器v1.0





	
	
	

        里面有注释,代码很简单,就是扫描“F:\\音乐"文件夹下所有文件,枚举出音频文件存到数组,打乱顺序,开始播放,监听audio标签。大家也可以改成扫描全盘文件,这个需要用递归实现,也要用到ActiveX控件的FileSystem对象。

        到这里,音乐播放器主程序就实现了,下面讲一下他的壳子,main.exe

        本来想用c#做exe文件的,不过,考虑到有一些电脑没有.net环境,可能会运行失败,所以后来改成了c++实现,下面先上代码。

#include 
#include 
#include 
using namespace std;
/**
 * [main 应用程序入口]
 * @param  argc [参数个数]
 * @param  argv [参数指针]
 * @return      [description]
 */
int KillProcessByTitle(const char* sWindowName);
int main(int argc,char **argv) {
    char **temp = argv;//接收参数指针
    string exePath=*temp;
    /*exe文件寻址*/
    exePath=exePath.replace(exePath.find("main.exe"),8,"")+"main.hta";
    /*string转char* */
    const char* htaPath=exePath.c_str();
    KillProcessByTitle("小小播放器v1.0");
    if(argc==2){
    	++temp;
    	ShellExecute(NULL, NULL, htaPath, *temp, NULL, SW_HIDE);
    }else{
    	ShellExecute(NULL, NULL, htaPath, "null", NULL, SW_HIDE);
    }
    return 0;
}
/**
 * [KillProcessByTitle 根据窗口名称关闭窗口]
 * @param  sWindowName [description]
 * @return             [description]
 */
int KillProcessByTitle(const char* sWindowName)
{
    HWND hWindow=FindWindow(NULL,sWindowName);
    if(hWindow==NULL)
    {
        return 1;
    }
    PostMessage(hWindow,WM_CLOSE,0,0);//向窗口发送WM_CLOSE消息关闭对话框窗口,如果该对话框是进程的子对话框则要进行后面的关闭进程操作
    DWORD dwProcessID;
    HANDLE hProcess;
    if(GetWindowThreadProcessId(hWindow, &dwProcessID)==0)
    {   
        return 2;   
    }   
 
    hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);   
    if(hProcess==NULL)   
    {   
        return 3;   
    }   
 
    if(!TerminateProcess(hProcess, 0))   
    {   
        return 4;
    }  
 
    return 0;
}

        我的电脑没有vc++和vs,所以我用的gcc编译的,gcc比较小巧。

        楼主做的这个windows应用因为是在虚拟机中执行,所以不像正常的windows编程那样方便操作窗体句柄和处理windows的消息机制。我们可以看到c++的实现很简单,一个main函数,用于打开音频文件给main.hta传参,main.hta里面这一句this.commandLine=musicPlayer.commandLine.split(" ");//接收命令行参数  就是接收参数的。另一个KillProcessByTitle()函数就是根据窗体名称关闭窗体,这样就防止了main.hta同时打开多个窗口,当程序运行时,双击音频文件,会先结束程序再重新创建窗体。

        此案例理论上支持win7及以上系统,不需要携带webkit库等乱七八糟的东西,软件体积不到1MB。这样看来,hta应用程序还是很实用的。

        用javascript开发windows应用的方法就简单给大家讲到这里,此案例仅供参考,请勿用于生产环境。

你可能感兴趣的:(桌面应用开发)