实在不好意思,写了上,中后,由于一直忙于项目,就没有完成最关键的工作。导致很多网友给我发邮件询问答案。同时对某些人发表的评论感觉到很伤心,本来就申明了文章写的很浅薄无知,很罗里八嗦的,并且将自己的心得发布给大家看,我自己不但没有好处,还浪费时间,凭什么发表了东西要被人骂?所以就一直不想继续写了。
现在看我写的上,中,可真是够细的了。其实,几句话就搞定,但是我那时可没有理解什么回调之类的东西,所以罗嗦很久了。
要得到其他程序上的控件句柄,首先给一个假定:其他程序的UI是不会变化的,比如,我们打开QQ,那么只要不升级,那么上午打开QQ,和下午打开QQ,其上的菜单,按纽之类的不会突然没有或者突然增加了。如果有变化,我这个方法不适用。
得到其他程序上的控件句柄,简单来说,基本流程是这样的。
首先运行要控制的窗口程序。
然后得到主窗口的句柄,上已经搞定。
然后有主窗口句柄得到该窗口上所有的控件句柄,中已经搞定。
有了上两步的基础,我们可以在正式编写程序控制其他程序窗口控件之前,再写一个辅助工具,用这个工具来帮助我们来确定我们要控制的控件句柄。方法如下:
通过
function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumProc;
lParam: LPARAM): BOOL; stdcall;
function EnumChildWndProc(AhWnd:LongInt;
AlParam:lParam):boolean;stdcall;
在EnumChildWndProc我们得到窗口中所有的控件句柄,每得到一个句柄,我们给这个控件发送一个SetWindowText消息,写上一个序号,从0开始,一直写完。
然后呢?我们看看我们想控制的程序的窗口,控件上的文字是不是变成了数字?对于不能显示文字的,我们就采用其他方法,只要能在这个过程中能找到控件的序号就可以了。
现在我们知道了需要控制的控件在原主窗口中被列举时的序号了。现在知道该怎么做了吧?
对,现在正式写控制程序了。同样的,我们在function EnumChildWndProc(AhWnd:LongInt;
AlParam:lParam):boolean;stdcall;
中用一个计数器,得到当前句柄序号,与需要控制的句柄序号对比,就确定下来需要控制的控件句柄了。
其他就好办了。