侧边栏壁纸
  • 累计撰写 22 篇文章
  • 累计创建 14 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

aardio 外部窗口基本操作

空空如也
2023-04-21 / 0 评论 / 0 点赞 / 417 阅读 / 1,559 字 / 正在检测是否收录...

(1)对外部窗口基本操作是win程序设计必学部分,下面介绍对窗口的获取,设置的一些基本操作

import win
import win.dlg.message
import process
 
//以Notepad为例子
process.executeWaitInput("Notepad")
 
/*窗口查找完整匹配{{*/
//查找窗口返回句柄,模糊查找使用winex.find
var $hwnd = win.find("Notepad")
 
//为配合看效果,用消息弹窗口来停留
var $msg = win.dlg.message($hwnd)
 
$msg.ok("窗口句柄:" + tostring($hwnd,16))
 
//查找子窗口(控件)返回句柄,模糊查找使用winex.findex
var $handle = win.findEx($hwnd,0,"Edit")
$msg.ok("控件句柄:" + tostring($handle,16))
 
/*}}*/
 
/*窗口状态检测{{*/
if win.isWindow($hwnd) $msg.ok("是有效窗口,用来检测是否窗口句柄")
if win.isIconic($hwnd) $msg.ok("最小化窗口状态")
if win.isZoomed($hwnd) $msg.ok("最大化窗口状态")
if win.isVisible($hwnd) $msg.ok("窗口可见")
if win.isEnable($hwnd) $msg.ok("窗口启用状态")
/*}}*/
 
/*窗口获取和设置{{*/
//窗口置顶,取消第二参数为false
win.setTopmost($hwnd)
 
//获取窗口大小和位置然后设置
var $x1,$y1,$x2,$y2 = win.getPos($hwnd,true) //true屏幕坐标
$msg.smile(string.join({$x1,$y1,$x2,$y2},","))
win.setPos($hwnd,$x1+100,100,500,600)
 
//隐藏窗口
win.show($hwnd,false)
$msg.frown("窗口不见了")
 
//设置窗口还原,最小化,最大化,隐藏
win.show($hwnd,9/*_SW_RESTORE*/) //还原窗口
$msg.smile("窗口回来了")
win.show($hwnd,6/*_SW_MINIMIZE*/) //窗口最小化
$msg.smile("窗口最小化了")
 
//通常我们认为的激活窗口就是这个,最小化也会还原
win.showForeground($hwnd)
$msg.smile("窗口被激活了")
 
//前置窗口并设置焦点
win.setForeground($hwnd)
$hwnd = win.getForeground() //返回激活窗口句柄
 
 
//设置焦点
win.setFocus($handle)
$handle = win.getFocus() //返回焦点所在窗口句柄
 
//设置窗口文本,是窗口就是标题,控件是文本
//外部窗口最好用 winex.getText 和 winex.setText
var $text = win.getText($hwnd)
$msg.great("窗口标题:" + $text)
 
//这个只能改变自己创建的窗口文本,外部窗口用winex.setText
win.setText($hwnd,"我是新的窗口标题")
 
 
/*}}*/
 
//发送wm_close消息,关闭窗口
//win.close($hwnd)

(2)winex库是win库的扩展,主要用作外部窗口的控制,下面是常用的一些操作

//winex是win库扩展,结合win库实现外部窗口操作
import winex
import process
 
process.executeWaitInput("notepad.exe")
 
/*窗口查找函数{{*/
//遍历所有顶层窗口
for hwnd,title,threadId,processId in winex.each( "", ".*" ) {
	//以标题来判断窗口 
	if string.find(title,"记事本") win.msgbox(title,hwnd)	
}
 
//以下窗口查找,支持模糊匹配,查找条件基本一致(窗口句柄,窗口文本,类名,控件id等)
if winex.findExists(,,"Notepad") win.msgbox("记事本窗口存在")
//winex.find 查找窗口
//winex.findEx 查找控件
//winex.findActivate //查找并前置窗口(最小化无效)
//winex.waitActive 等待窗口激活
//winex.waitStyle 等待指定窗口样式出现
//winex.waitEnabled 等待指定窗口启用
//winex.waitVisible 等待指定窗口显示
var $hwnd,$hEdit = winex.wait(,,"Notepad","Edit")
/*}}*/
 
 
win.setForeground($hwnd) 
win.delay(2000)
 
/*以消息形式发送文本{{*/
//发送WM_SETTEXT消息,会清除之前的会文本,焦点不会变化
winex.setText($hwnd,"我是新窗口标题")
winex.setText($hEdit,'你好啊,后台发送可以吗\r\n')
//发送EM_REPLACESEL消息
winex.sendString('当然是可以的\r\n',$hEdit)
//发送WM_CHAR消息
winex.say('我还是一个个打字吧\r\n',$hEdit)
/*}}*/
 
//向窗口发送BM_CLICK点击消息,通常是按钮控件
winex.click($hEdit) 
 
//关闭窗口
//winex.close($hwnd)
 

(3)窗口键盘鼠标模拟

窗口的键盘鼠标模拟,可以用来实现后台窗口操作

//向窗口发送键盘,鼠标消息,窗口后台操作也可以
import winex
import winex.key
import winex.mouse
import process.popen
 
var $key = winex.key
var $mouse = winex.mouse
 
//在64位系统会返回64位进程,兼容32位系统才可修改标题
process.popen.cmd64("notepad.exe")
 
var $hwnd,$hEdit = winex.wait("记事本",,"Notepad","Edit")
 
var $text = 
/*
1
2
3
4
5
6
7
8
9
10
*/
//设置文本用来演示效果
winex.setText($hEdit,$text)
win.setPos($hwnd,100,100,500,300)
 
 
//附加到外部线程窗口,保证后台输入成功
if winex.attach($hEdit) win.msgbox("附加线程成功")
 
/*模拟按键{{*/
//最小化窗口,后面的操作用后台完成
win.show($hwnd,6/*_SW_MINIMIZE*/)
win.setFocus($hEdit)
 
//分别发送WM_KEYDOWN,WM_CHAR,WM_KEYUP消息模拟键盘打字
$key.send($hEdit,"你好Test")
 
//模拟键盘按下K键,发送wm_keydown消息
$key.down($hEdit,"K")
//弹起K键,发送wm_up消息
$key.up($hEdit,"K")
 
//设置击键的间隔时间100毫秒,默认是5毫秒
$key.delayClick = 100
 
//模拟按下K键
$key.click($hEdit,"k")
 
//发送组合键,必须先附加线程 winex.attach
win.showForeground($hwnd) //还原看效果
$key.combine($hEdit,"CTRL","A") //全选
/*}}*/
 
win.delay(4000)
 
//发送 _wm_mousemove消息,模拟鼠标移动
$mouse.move($hEdit,50,80)
 
//发送 WM_LBUTTONDOWN 和 WM_LBUTTONUP消息,模拟按下和弹起
$mouse.down($hEdit,100,100)
$mouse.up($hEdit,100,100)
 
//模拟在窗口位置点击
$mouse.click($hEdit,100,200)
 
//发送 WM_LBUTTONDBLCLK 消息,模拟左键双击
$mouse.clickDB($hEdit,100,300)
 
//右键点击,其它函数跟左键一样
$mouse.rb.click($hEdit,100,300)
 
//模拟中键向下向上滑动,其它函数跟左键一样
$mouse.mb.roll($hEdit,100,200,100)
$mouse.mb.roll($hEdit,100,200,-100)

(3)64位窗口问题

aardio程序是32位运行,用process.execute 打其它exe文件,比如记事本,修改窗口标题就没办法改成功。后来测试发现在64位系统要打开进程是64位进程才行。

import winex
import process.popen
//在64位系统会返回64位进程,兼容32位系统才可修改标题
process.popen.cmd64("notepad.exe")
 
$hwnd = winex.wait(,,"Notepad")
win.msgbox($hwnd)
winex.setText($hwnd,"新窗口标题")
0

评论区