您的位置: 首页 > 老体动态

易语言编写事件处理函数,掌握事件驱动模型实现进阶编程


' 声明事件
事件 剪贴板_内容改变()
' 绑定事件
绑定剪贴板_内容改变(事件处理函数)
' 事件处理器
子程序 事件处理函数()
    ' 事件处理代码
    输出("剪贴板内容发生了改变")
结束子程序

控件看着好像很简单那种样,可是却能够直截了当地去决定用户跟软件之间交互的效率以及体验。针对于那些使用易语言的开发者而言,理解把握怎样让控件变得“活灵活现”些,并且能够安全无虞地跟其他程序进行交流对话这一点,是提高应用能力不可或缺的极为关键的一个步子。

子程序 窗体_鼠标按下(整数型 按钮状态, 整数型 鼠标X, 整数型 鼠标Y)
    ' 鼠标点击事件处理代码
    如果 按钮状态 = 1 则
        输出("鼠标左键被按下")
    否则如果 按钮状态 = 2 则
        输出("鼠标中键被按下")
    否则
        输出("鼠标右键被按下")
    结束如果
结束子程序

窗体与控件基础

于易语言里,窗体乃程序之主要容器,至于按钮、文本框以及标签等控件,却是构建用户界面之核心元素。于进行开发的期间,要在窗体之上放置这些控件,还要设定其位置、大小以及显示文本等基本属性。每一个控件承纳着特定的交互功能。

事件处理函数 窗体1_按钮1按下
    信息框("按钮被点击了!", "提示")
返回 0

单单只是设置外观是不行的,一定要让控件对用户操作作出响应。达成此需借助为控件的事件编写处理函数来达成。举例来讲,当用户点击一个按钮时,其“被单击”事件所对应的代码就会被执行,进而完成登录、计算或者跳转等具体任务。

文本框控件.Text = "欢迎使用"
标签控件.Caption = "请输入用户名:"

调用外部程序


# 5. 与外部程序(如MSN)交互的方法
## 5.1 外部程序交互机制概述
### 5.1.1 外部程序的概念与调用方式
外部程序可以理解为独立运行的、不属于当前应用程序的程序。在易语言中,我们可以通过多种方式调用外部程序,例如使用 `运行` 命令调用,或者使用DLL导入函数进行更深层次的交互。
在易语言中,可以通过 `运行` 命令配合程序的完整路径来启动外部程序。这种方式简单直接,适用于大多数外部程序的调用需求。例如:
```e
运行("C:\Program Files\MSN Messenger\Msnmsgr.exe")

时或程序需借助外部工具,于易语言里,能够运用“执行”命令径直发动系统之上的其他可执行文件,譬如,若欲开启MSN Messenger,仅需给出其可执行文件的确切路径,程序便会调用系统命令启动它。

但这般调用属于浅层次,仅仅等效于用户亲自手动双击去打开。要是想达成更复杂的交互。比如说向MSN送去消息或者读取其状态。那就得运用更高级的技术。这一般会牵涉到调用系统API,或者第三方所给予的动态链接库函数。

进程管理

程序启动之后,那么操作系统,就会进而为其去创建其一进程。易语言,给供给些“运行”等函数去创建新进程,并且呢能够凭借“取执行文件名”来获取当下程序的路径信息,这些对于那些需要定位自身或者相关文件所在位置的应用而言是颇具帮助作用的。

.版本 2
.程序集 程序集1
.子程序 _启动MSN, 整数型, , , 启动MSN Messenger
    运行("C:\Program Files\MSN Messenger\Msnmsgr.exe")
.子程序结束

与此同时,程序能够获取当前系统里正在运行的别的进程列表,这借助调用“取系统进程列表”等函数达成,可用于监测特定软件是否已然启动,或者开展简单的进程管理,为后续的进程间通信奠定基础。

.版本 2
.程序集 程序集1
.子程序 _导入DLL, 整数型, , , 导入DLL函数
    .局部变量 hInst, 整数型
    .局部变量 func, 整数型
    hInst = 取DLL句柄("user32.dll")
    .如果 (hInst = 0)
        .返回 0
    .否则
        func = 取DLL函数句柄(hInst, "MessageBoxA")
        .如果 (func = 0)
            .返回 0
        .否则
            .返回 调用DLL函数(0, func, 0, "这是一个测试", 0)
        .结束如果
    .结束如果
.子程序结束

进程间通信方法

通信通道是管道这种,那种允许数据作单向流动的东西。于易语言里,能够去创建有匿名性质的管道或者含命名的管道,运用“管道读”以及“管道写”函数来开展数据传输。借着如此种方式常常被用于本地的父子进程之间互相通信,还有兄弟进程之间进行通信 。

另一种高效通信方式是共享内存,它能让两个或者多个进程去访问同一物理内存区域,进而避免了因数据拷贝所产生的开销,易语言借助“创建文件映射”以及“映射视图”等函数得以实现,适用于需要大量数据快速交换的场景 。

.版本 2
.程序集 程序集1
.子程序 _启动进程, 整数型, , 
.局部变量 程序路径, 文本型
.局部变量 进程ID, 整数型
程序路径 = 取程序目录 + "\example.exe" ' 假设我们要启动的程序名为example.exe
进程ID = 执行命令(程序路径, , , , , 0, 0, 0, 0, 真, , , , )
如果 (进程ID = 0)
    输出("程序启动失败")
否则
    输出("程序启动成功,进程ID:" + 转文本(进程ID))
结束如果
返回 (进程ID)

同步机制与调试

.版本 2
.程序集 程序集1
.子程序 _调整优先级, 整数型, , 
.局部变量 进程句柄, 整数型
.局部变量 优先级, 整数型
进程句柄 = 取进程句柄("example.exe") ' 假设我们要调整的进程是example.exe
优先级 = 取进程优先级(进程句柄)
输出("当前example.exe的优先级是:" + 转文本(优先级))
设进程优先级(进程句柄, 高) ' 将进程优先级设置为高
返回 (0)

在多个进程同时对共享资源进行访问之际,是需要借助同步机制去防范冲突发生的。信号量作为常用的工具应用其中,易语言学是支持对其进行创建、等待以及释放操作的。这种方式能够确保处于某一个时刻之时,仅有单个进程可有执行关键代码段的权利,进而保证了数据层面操作的完整性质 。

程序开展过程中难以避免会碰到差错,而调试这件事极其关键。易语言内部设置了调试方面的支持,像“设置断点”、“单步进行跟踪”等功能,它让从事开发的人员能够一行一行地去查看代码运行的状态,留意变量的改变情况,进而能够迅速找出逻辑方面的错误或者在交互期间所出现的问题。

综合应用与安全

把控件交互、进程管理以及通信技术联合起来,能够构建功能强大的应用,比如说,开发一个管理工具,该工具界面上的按钮能够控制外部程序的启动与关闭,并且借助共享内存或者管道实时获取那个程序的状态数据显示在文本框里。

.版本 2
.程序集 程序集1
.子程序 _管道通信, 整数型, , 
.局部变量 管道, 整数型
.局部变量 写入数据, 文本型
.局部变量 读取数据, 文本型
管道 = 创建管道()
如果 (管道 = 0)
    输出("创建管道失败")
否则
    写入数据 = "Hello, World!"
    如果 (管道写数据(管道, 写入数据) = 真)
        输出("写入数据成功:" + 写入数据)
    否则
        输出("写入数据失败")
    结束如果
    如果 (管道读数据(管道, 读取数据) = 真)
        输出("读取数据成功:" + 读取数据)
    否则
        输出("读取数据失败")
    结束如果
结束如果
返回 (0)

然而,存在这样一种情况,调用外部的函数或者程序是有着风险的。尤其是那种从网络上下载而来的未知的动态链接库,其有可能包含着恶意代码。所以,开发者必须要保证所调用的外部模块的来源是可靠的,在必要的时候要进行安全扫描,并且要在设计的时候考虑权限最小化的原则,以此来保障最终用户的系统安全。

于试图促使易语言程序同外部繁杂程序像往昔的MSN开展深度交互之际,你觉得所面临的最为重大的技术挑战会是啥呢?是接口的不稳定状况,还是通信协议的复杂特性呢?欢迎在评论区域分享你的见解或者经验。

.版本 2
.程序集 程序集1
.子程序 _共享内存示例, 整数型, , 
.局部变量 共享内存句柄, 整数型
.局部变量 映射内存句柄, 整数型
.局部变量 内存指针, 字节指针型
.局部变量 写入数据, 字节型
.局部变量 读取数据, 字节型
共享内存句柄 = 创建共享内存(0, 4096, 真) ' 创建大小为4096字节的共享内存
如果 (共享内存句柄 = -1)
    输出("创建共享内存失败")
否则
    映射内存句柄 = 映射共享内存(共享内存句柄)
    如果 (映射内存句柄 = 0)
        输出("映射共享内存失败")
    否则
        内存指针 = 映射内存(映射内存句柄)
        写入数据 = 字节型数组("Hello, Shared Memory!")
        内存复制(内存指针, 写入数据, 长度(写入数据))
        读取数据 = 内存复制(内存指针, 空字节型数组(长度(写入数据)), 长度(写入数据))
        输出("从共享内存读取的数据:" + 字符串(读取数据))
    结束如果
    取消映射内存(映射内存句柄)
结束如果
关闭共享内存句柄(共享内存句柄)
返回 (0)