什么是「窗口」:
hwnd = win.find(class,title)
找独立窗体,返回找到窗体的句柄.
class参数为字符串格式指定窗体类,
title参数为字符串格式指定窗体标题(必须是完整标题或者不指定标题)
类名与标题可以忽略其中的一个,如果为空值或为nil值则匹配所有,
hwnd = win.findX(parent,after,class,title)
在指定的窗口内查找子窗口,仅检查子窗口,而不检查更深层的子窗口的子窗口。
parent指定父窗体,如果为零表示桌面窗体。
after指定前面的窗体。0表示忽略这个参数第第一个子窗口开始查找。
class参数为字符串格式指定窗体类,
title参数为字符串格式指定窗体标题(必须是完整标题或者不指定标题)
类名与标题可以忽略其中的一个,如果为空值或为nil值则匹配所有,
hwnd = win.FindXX( hwndParent ,"类名","标题包含的字符串",ID)
在指定窗体中查找控件窗口。以所有子窗口作为查找范围(检查更深层的子窗口的子窗口)
hwndParent指定父窗体,查找范围是主窗体下面所有层的子窗口。而且查找速度非常快。
不要将hwndParent指定为0或nil。
类名与标题可以忽略其中的一个,如果为空值或为nil值则匹配所有,
标题可以是标题的任何部份(不需要完整的标题)。
最后一个参数为数字值指定控件ID。
win.findX只能忽略标题或者匹配完整的标题。可是标题很多时候都是动态的。
而win.findXX虽然可以指定标题的部份子串,可是并不适合用来查找顶层的独立窗体。
所以我们需要枚举桌面的全部窗体,然后分析窗体属性。
我们用泛型for循环来遍历所有桌面窗体。请看下面的例子。
strng.gfind枚举窗体的方法仍有不足,因为大多时候我们要查找的只是某个程序的窗体。
这就要用到一个新的函数win.fromFile
hwnd = win.fromFile(exefilename,"类名","标题包含的字符串")
hwnd = win.fromPID(pid,"类名","标题包含的字符串")
这两个函数的用法完全相同,不同的是第一个参数:
win.fromFile的第一个参数是应用程序的文件名, win.fromPID的每一个参数是进程ID。
后面两个都是可选参数,"类名"和"标题包含"都是可以省略的。
所有找到的窗体句柄都增加到返回值队列中。返回值可能有多个。
下面的写法都是正确的。
如果需要全部的返回值的话,最好是把返回值放到table表构造器{}中创建一个table数组。
--读取所有句符合条件的名柄,将所有返回值放在{ }内部生成table数组
thwnd = { win.fromFile("文件名.exe","#32770","标题包含") };
--遍历数组
for i,hwnd in ipairs(thwnd) do
print(hwnd,win.class(hwnd),win.id(hwnd),win.getString(hwnd))
end
--读取所有句符合条件的名柄,将所有返回值放在{ }内部生成table数组
--不同的是这个函数的第一个参数指定进程ID
--通常win.exec运行外部文件成功会返回一个进程ID,
--通过win.tPID可以列出系统所有进程ID及详细信息。
thwnd = { win.fromPID(pid,"#32770","标题包含") };
--遍历数组
for i,hwnd in ipairs(thwnd) do
print(hwnd,win.class(hwnd),win.id(hwnd),win.getString(hwnd))
end;
win.fromFile win.fromPID 返回所有窗体(不包括控件),但是不一定是顶层窗体
hwnd = win.fromPos(x,y)
可查找指定坐标的窗体,
参数x,y指定坐标值.
示例:
x,y = mouse.getPos(); --读取当前鼠标所在坐标
hwnd = win.fromPos(x,y); --从指定的坐标读取窗体句柄
win.setForeground(hwnd); --把找到的窗体激活并移动到最前面
hwnd = win.getParent(hwnd)
返回指定窗体的父窗体.
hwnd参数为窗体句柄.
hwnd = win.getTop(hwnd)
返回指定窗体的最顶层父窗体.
hwnd参数为窗体句柄.
hwnd = win.desktop();
返回顶层桌面窗体句柄
hwnd = win.getFocus(hwnd)
hwnd参数为窗体句柄,返回值为窗体上当前拥用输入焦点的控件句柄.
win.show(hwnd[,true|false|mode])
参数hwnd指定窗口句柄,参数二设置为true显示,设置为false隐藏,其他可选项如下:
_SW_HIDE = 0
_SW_NORMAL = 1
_SW_SHOWMINIMIZED = 2
_SW_MAXIMIZE = 3
_SW_SHOWNOACTIVATE = 4
_SW_SHOW = 5
_SW_MINIMIZE = 6
_SW_SHOWMINNOACTIVE= 7
_SW_SHOWNA = 8
_SW_RESTORE = 9
_SW_SHOWDEFAULT = 10
_SW_MAX = 11
win.show(hwnd); --显示
win.show(hwnd,true); --显示
win.show(hwnd,false); --隐藏
win.show(hwnd,_SW_HIDE ); --隐藏
mode参数的使用方法与 web.show 函数相同
win.close(hwnd); --关闭窗口
win.min(hwnd); --最小化窗口
win.max(hwnd); --最大化窗口
win.restore(hwnd); --恢复窗口大小
cls = win.class(hwnd) --读取类名。
hid = win.id(hwnd) --读取控件ID,注意只有控件才有ID,普通窗体是没有ID的。
str = win.getString(hwnd) --读取控件文本或者窗体标题。
pid = win.PID(hwnd); --读取窗口所在的进程ID。
tid = win.threadID(hwnd); --读取指定窗体线程ID。
hung = win.isHung(hwnd); --检测窗体是否失去响应,返回bool值。
win.postMessage(hwnd,msg,wparam,lparam)
--向目标窗口发送消息,参数都是数字值(wparam,lparam参数可以是字符串,将自动转换为指针)
win.sendMessage(hwnd,msg,wparam,lparam)
--向目标窗口发送消息,参数都是数字值(wparam,lparam参数可以是字符串,将自动转换为指针)
hwnd指定窗口句柄,msg指定消息,wparam、lparam指定参数。
使用方法与其他编程语言相同,至于不同消息的具体数值,可查阅windows编程相关资料。
hwnd = win.getForeground()
--返回桌面上最前面的窗体句柄。
win.setForeground(hwnd);
--把找到的窗体激活并移动到最前面。
win.topMost(hwnd,true)
--设置窗体始终在最前面
win.topMost(hwnd,false)
--取消窗体始终在最前面
x,y,x2,y2 = win.getRect(hwnd);
--hwnd参数指定窗体句柄。
--如果执行失败,返回nil值。
-- 如果执行成功,x,y返回值为左上角坐标,x2,y2为右下角坐标。
win.setRect(hwnd,x,y,x2,y2)
--设置窗体位置与大小。
--hwnd为窗体句柄,x,y为左上角坐标, x2,y2为右下角坐标。
win.consoleOpen()
--打开控制台窗口,您可以使用标准IO库读取用户输入或输出信息,
--也可以直接用print()函数输出信息;
win.consoleClose()
--关闭控制台窗口
win.paste(hwnd) --向窗体发送粘贴命令
win.copy(hwnd) --向窗体发送拷贝命令
用法1、
指定窗口句柄
local hwnd = win.getForeground(); --读取前台窗体句柄。
hwnd = win.getFocus(hwnd); --读取前台窗体的焦点控件句柄。win.sendString(hwnd,"") --以默认方式发送文本。
win.sendStringX(hwnd,"") --以ANSI方式发送文本。
win.sendStringXX(hwnd,"") --以SEND方式发送文本。
--失败返回nil,成功返回true;
用法2、
不指定窗口句柄,模拟精灵将自动获取前台窗体的焦点控件句柄
win.sendString("发送内容") --以默认方式发送文本。
win.sendStringX("发送内容") --以ANSI方式发送文本。
win.sendStringXX("发送内容") --以SEND方式发送文本。
--失败返回nil,成功返回true;
win库的鼠标键盘模拟函数与key库、mouse库不同,
不会影响真正的鼠标键盘,也看不到鼠标移动,但是可以让目标窗口收到鼠标键盘命令。
但这种方法
对于大部份游戏无效。
这种方法主要用于桌面程序。
如果是网页上的web程序。请使用web窗体可以完美的支持后台操作而无需任何复杂的技术。
要准确的找到窗口句柄!
如果你发现下面的函数对于桌面程序没有起到预期的作用。大多时候只有一个原因。
就是句柄弄错。例如向窗体发送一个应当发向按钮的指令。或者向按钮发送一个应当发向对话框的指令。
1. win.mouseDown() 按下鼠标左键,有两种用法
win.mouseDown(hwnd,x,y) --指定窗口发送
win.mouseDown(x,y) --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄
失败返回nil,成功返回true;
2. win.mouseUp() 释放鼠标左键,有两种用法
win.mouseUp(hwnd,x,y) --指定窗口发送
win.mouseUp(x,y) --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄
失败返回nil,成功返回true;
win.keyDown(hwnd,"键名") --指定窗口发送
win.keyDown("键名") --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄
失败返回nil,成功返回true;
win.keyUp(hwnd,"键名") --指定窗口发送
win.keyUp("键名") --不指定窗口,由程序查找当前激激活窗口的焦点控件句柄
失败返回nil,成功返回true;
win.click() --无参数,自动查找顶层窗口,自动查找焦点按钮并点击
win.click(hwnd) --指定窗体,自动查找焦点按钮并点击
win.click(hwnd,ID) --指定窗体,指定按钮ID(用模拟精灵的录制功能查查看按钮ID)
str = win.openDlg("标题","All Files (*.*)|*.*||")
打开文件对话框,返回一组选择的文件路径,第一、第二个参数都可以省略。
允许选择多个文件,每个文件路径增加一个返回值。
str = win.saveDlg("标题","All Files (*.*)|*.*||")
保存文件对话框,第一、第二个参数均可省略
str = win.dirDlg("标题")
选择目录对话框,参数可省略
str = win.inputBox("信息","标题")
两个参数都可以省略,弹出一个输入对话框获取用户输入。
如果用户按取消返回空字符串。
win.messagePrint(str)
str参数指定显示信息,这是一个字符串格式参数.
这个函数的作用是在模拟精灵的浮动工具栏上打印信息.
如果str的第一个字符是@,则会在前面自动添加一个方向变化的箭头,多次调用就会出现一个旋转的指针。
ok = win.messageBoxTest("询问用户的信息","标题"))
返回布尔值表示用户是否按了“确定”按钮。
id = win.messageBox("信息","标题",样式 )
第二第三个参数都可以省略。
可用第三个参数设置对话框样式,第二个参数设置标题。
简单的弹出一个对话题:
弹出自定义样式的对话框(更多的样式常量请参考《模拟编程WINAPI使用手册》):
_MB_YESNOCANCEL = 0x00000003;
_MB_ICONQUESTION = 0x00000020;
_IDYES = 6;
_IDNO = 7;
id = win.messageBox("这是一个自定义对话框","标题",MB_YESNOCANCEL | MB_ICONQUESTION)
if(id == _IDYES)then
win.messageBox("你按了[是]")
elseif(id == _IDNO)then
win.messageBox("你按了[否]")
else
win.messageBox("你按了[取消]")
end
1、发送消息到指定窗口,不等待返回值
win.postMessage(hwnd,msg,wParam,lParam);
hwnd参数指定窗口句柄,msg参数指定消息ID,wParam,lParam为附加参数。
2、发送消息到指定窗口等待返回值
win.sendMessage(hwnd,msg,wParam,lParam);
hwnd参数指定窗口句柄,msg参数指定消息ID,wParam,lParam为附加参数。
3、发送消息到指定线程,不等待返回值
win.postThreadMessage(tid,msg,wParam,lParam);
tid参数指定线程id,msg参数指定消息ID,wParam,lParam为附加参数。
下面是一个例子,通过发送消息自动关闭显示器。
下一节内容:win库-文件操作