Aauto在键盘监视时的问题
在监视键盘时,使用模拟按键不响应,代码如下:
//打开控制台窗口
io.open()
io.print("正在监视按键,按ESC键退出!")
//导入HOOK库
import labs.win
import key.hook
FindWindowExA := User32.api( "FindWindowExA", " INT ( int hWnd, int hWnd2,string lm ,string lm2 )","stdcall")
//创建录制钩子
hk = key.hook();
SetForegroundWindow := ::User32.api("SetForegroundWindow","int(int hwnd)")
hw = FindWindow("Notepad", "新建 文本文档 - 记事本")//一个新建记事本的窗体句柄
//录制回调函数
hk.proc=function(msg,vkcode,scancode){
var kn = key.getname( vkcode );
if( vkcode == key.map.VK_ESCAPE)
win.quitMessage();
select(msg) {
case 0x100/*_WM_KEYDOWN*/ ,0x104/*_WM_SYSKEYDOWN*/
{
if(kn=="K"){
if(key.getState("CTRL"))
//按下组合键“CTRL”和“K”
SetForegroundWindow(hw)
::ShowWindow(hw,0x3/*_SW_MAXIMIZE*/)
//前置记事本的窗体,并最大化
key.press(0,"CTRL","O")
i=FindWindowExA(hw,0,"#32770",)
sleep(1000)
i=FindWindowExA(hw,0,"#32770",)
sleep(1000)
if(i)
win.msgbox(i,"AAuto")
else
win.msgbox(hw,"AAuto")
//模拟按下组合键“CTRL,"O"组合键,弹出记事本的“打开”窗口,并打印出找到的“打开”窗口的句柄
}
}
case 0x101/*_WM_KEYUP*/,0x105/*_WM_SYSKEYUP*/
{
//io.print("弹起",kn)
}
}
}
import win;
//录制需要消消息循环
win.loopMessage()
由例子修改而来,运行后无论如何也找不到弹出的“打开”窗口的句柄(即变量i),但是如果不是在监视键盘的状态下,则可以找到这个“打开”窗口的句柄,即可以找到 (变量i)
请问一下是什么问题呢?
答:
代码没有注意规范是一个导致错误的原因。
如果排版一下,你就会发现 if(key.getState("CTRL"))这句后面没有语句块
if语句没有清晰的嵌套,并不知道他是管哪几个语句:
|
正确的写法应当是
|
说明if语句是控制哪些语句,被控制的语句应当缩进。
一组执行类似功能的语句应当前后有空行,类似文章的段落
如果这个条件语句是管一个语句,应当象下面这样写:
|
用缩进表明逻辑结构
而单字母变量名一般是不应当使用的,例如下面的i,通常作为循环控制变量,放在这里容易误解。
可能你觉得没什么,反正我自已心里清楚,但是一点点积累起来,最后就是很难看懂,你在看自已代码的时候,大脑就要处理更多的信息(只是你自已可能感觉不到)
i=FindWindowExA(hw,0,"#32770",) |
如果每个变量,代码都不知不觉的消耗你的脑力,无论是你,还是他人就失去阅读代码的愉悦感,不能充份的释放脑力,集中到解决方案上。
这就导致了可能纠结在一些简单的问题上,不容易发现错误。
类似的,还有下面的:
i=FindWindowExA(hw,0,"#32770",) |
缩进不整齐,这可能是因为在代码内部用了tab和空格多种缩进方式,导致论坛格式化以后导致的,应当避免在一个文件中使用我种缩进字符,完成以后可以替换一下。
注释也不应当写在后面,而应当写在需要解释的代码前面。
发代码以前可以右键点代码,选择“复制全部到HTML”再发到论坛,可保持较好的格式。
另外自动生成的代码并不是全部符合新的规范,需要手工整理一下,以后的发行版所有代码将会向规范靠拢。
|
浙公网安备 33010602011771号