快手软件

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(kn=="K"){
                if(key.getState("CTRL"))
                //按下组合键“CTRL”和“K”
                SetForegroundWindow(hw)
                ::ShowWindow(hw,0x3/*_SW_MAXIMIZE*/)
                //前置记事本的窗体,并最大化
                key.press(0,"CTRL","O")



正确的写法应当是


    if(kn=="K") {

                if(key.getState("CTRL")) {

                      //按下组合键“CTRL”和“K”
                      SetForegroundWindow(hw)
                      ::ShowWindow(hw,0x3/*_SW_MAXIMIZE*/)


                      //前置记事本的窗体,并最大化
                      key.press(0,"CTRL","O")

                      ......
                }
                ......
    }



说明if语句是控制哪些语句,被控制的语句应当缩进。
一组执行类似功能的语句应当前后有空行,类似文章的段落

如果这个条件语句是管一个语句,应当象下面这样写:


    if(kn=="K") {

              if(key.getState("CTRL"))  
                      SetForegroundWindow(hw)//按下组合键“CTRL”和“K”


                ::ShowWindow(hw,0x3/*_SW_MAXIMIZE*/)
                //前置记事本的窗体,并最大化
                key.press(0,"CTRL","O")
                ......
                }
                ......
    }



用缩进表明逻辑结构

而单字母变量名一般是不应当使用的,例如下面的i,通常作为循环控制变量,放在这里容易误解。
可能你觉得没什么,反正我自已心里清楚,但是一点点积累起来,最后就是很难看懂,你在看自已代码的时候,大脑就要处理更多的信息(只是你自已可能感觉不到)

i=FindWindowExA(hw,0,"#32770",)


如果每个变量,代码都不知不觉的消耗你的脑力,无论是你,还是他人就失去阅读代码的愉悦感,不能充份的释放脑力,集中到解决方案上。

这就导致了可能纠结在一些简单的问题上,不容易发现错误。

类似的,还有下面的:

            i=FindWindowExA(hw,0,"#32770",)
                sleep(1000)
              if(i)
                  win.msgbox(i,"AAuto")
              else
                  win.msgbox(hw,"AAuto")
                  //模拟按下组合键“CTRL,"O"组合键,弹出记事本的“打开”窗口,并打印出找到的“打开”窗口的句柄



缩进不整齐,这可能是因为在代码内部用了tab和空格多种缩进方式,导致论坛格式化以后导致的,应当避免在一个文件中使用我种缩进字符,完成以后可以替换一下。

注释也不应当写在后面,而应当写在需要解释的代码前面。

发代码以前可以右键点代码,选择“复制全部到HTML”再发到论坛,可保持较好的格式。

另外自动生成的代码并不是全部符合新的规范,需要手工整理一下,以后的发行版所有代码将会向规范靠拢。


编程就是试图将混乱的思路整理清晰,并找到最佳解决方案的一个过程。
如果不注重代码风格,不尽力使用代码清晰的去展现自已的思想,哪等于是给正确的解决方案增加障碍。

posted on 2010-10-01 21:57  快手软件  阅读(539)  评论(0)    收藏  举报

导航