假设我想运行的外部程序是ABC.EXE,在VB中应如何利用FindWindow()函数查找该程序是否仍在运行?
要使用API,评选建立一个.BAS模块,然后从winapi32.txtk 中Copy如下的FIndWindow()函数的声明:
Declare Function FindWindow Lib "user32" Alias "FindWindowA"(ByVal LpClassName as String,Byval lpWindowName as Stirng ) as Long
这个函数有两个基本点参数,第一个是要找的窗口的类,第二个是要找的窗口的标题.在搜索的时候一定两者都知道,但至少要知道其中的一个.有的窗口的标题的比较容易得到的,如"计算器":,所以搜索时就使用标题进行搜索.但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便.如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0.
前面提到的VB的FindWindow()函数的声明将两个基本点参数都定义为String类型,而在实际使用过程中,如果我们忽略某个参数就将该参数的定义又As StriNG书库As Any.这里的As Any 相当于C语言中的强制类型转换.例如,如果我们忽略窗口的类,就将定义修改如下:
Declare Function FIndWindow lib "user32" alias "findwoindowA"(ByVal lpClassName as Any,ByVal lpWIndowName as String) as Long
然后,在调用使用如下语句:
:hwndCalc=FindWIndow(0&,"计算器")
这里的0&就表示忽略类名.需要注意的是FindWindow(0&,"计算器"),和FindWindow("","计算器")在两种完全不同的含义前者表示忽略窗口的类,后者表示窗口的类是个空串.类似的,我们也可以忽略标题而搜索指定的类.
从上面的讨论中可以看出,如果说要搜索的外部程序的窗口标题比较容易的话,怎么问题是比较简单的.可如果窗口的标题不固定的或者根本就没有标题,怎么得到窗口的类吧?如果你安装了Visual C++,你可以攻玉使用其中之一的Spy++(v如果没有VC++,在VB的盘上也可以找到spy),在spy++中有一个FIndWindow工具,它允许你使用鼠标选择窗口,然后Spy++会显示这个窗口的类.
在Win32API中还有一个FindwindowEx,它非常适合寻找子窗口.
评论