如何通过编程得到所有窗体的标题及类名称

如果我们想通过编程来检测某个窗口是否存在,我们通常会使用 Windows API 函数中的 FindWindow(),而且,通常我们又不知道要获得窗口的类名称,所以我们经常性的忽略第一个参数,而是只使用窗口标题来检测窗口,这里就出现了一个问题:若该窗口没有标题或有变化标题(如IE)则我们就需要使用类名称进行查询了。当然,我们可以通过 VS 中提供的 spy++ 这样的工具来获得桌面窗口的类名称,但对于没有安装 VC++ 的朋友想必就要借助第三方软件了,与其这样为什么不自己动手呢?其实,对于整个枚举过程,完全可以基于 EnumWindows() 函数,而我们需要做的,只是给这个函数定义一个布尔类型的回调函数(这里我们命名为 EnumFunc()),并给它赋予两个要求的长整参数 hwndlParam,最后将自己需要的代码内容写入函数内部。具体代码如下:
如果您使用 VC++ 来编程,那么您可以参考以下代码:
#include "stdafx.h"
#include 
"stdio.h"
#include 
"windows.h"
#include 
"string.h"

bool
 CALLBACK EnumFunc(HWND hwnd, LPARAM lParam)
{
    
char sString[2001],sClassName[2001];
    
    
int hFunc=GetClassName(hwnd,(LPTSTR)sClassName,2000);
    
int hFunc2=GetWindowText(hwnd,(LPTSTR)sString,2000);

    
if(hFunc!=0)
    
{
        
if(hFunc2==0)
            strcpy(sString,
"(无)");
        printf(
"句柄:%ld 标题:%s 类:%s ",hwnd,sString,sClassName);
    }

    
return TRUE;
}


void main(int argc, char*
 argv[])
{    
    
if(argc==2)
    
{
        
if(argv[1]=="/love")
            printf(
"%s ","I love WYC!");//这是一个彩蛋
    }

    printf(
"%s ","取得所有窗口的标题和类名称");
    printf(
"%s ","(C) 2006 Wei CHEN");
    
if(EnumWindows((WNDENUMPROC)EnumFunc,0)==0)
        printf(
"%s ","枚举出现错误");
}
如果您使用 VB 来编程,那么您可以参考以下方法:
新建一个 标准EXE 工程,并在 Form1 窗体上绘制一个 ListBox 命名为 List1,然后新建一个 模块并声明 API 函数:
Option Explicit
'//要求声明使用的所有变量
Public Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hwnd As LongByVal lpString As String _
ByVal cch As LongAs Long
Public Declare Function EnumWindows Lib "user32" (ByVal _
lpEnumFunc 
As LongByVal lParam As LongAs Long
Public Declare Function GetClassName Lib "user32" Alias _
"GetClassNameA" (ByVal hwnd As LongByVal lpClassName As _
StringByVal nMaxCount As LongAs Long
然后写入回调函数:
Public Function EnumFunc(ByVal hwnd As LongByVal lParam As LongAs Boolean
    
Dim hFunc As Long, hFunc2 As Long
    
Dim sString As String, sClassName As String

    sString 
= String(2000Chr(0))
    sClassName 
= String(2000Chr(0))
    hFunc 
= GetClassName(hwnd, sClassName, 2000)
    hFunc2 
= GetWindowText(hwnd, sString, 2000)
    
    
If hFunc <> 0 Then
        
If hFunc2 = 0 Then
            sString 
= "(无)"
        
Else
            sString 
= Left$(sString, InStr(1, sString, Chr(0)) - 1)
        
End If
        Form1.List1.AddItem 
"句柄:" & hwnd & " 标题:" & sString & " 类:" & sClassName
    
End If

    EnumFunc 
= True
End Function
最后在 Form1Form_Load() 过程中添加调用:
Private Sub Form_Load()
    
If InStr(1Command"/love", vbTextCompare) _
    
Then List1.AddItem "I love WYC!" '//这是一个彩蛋
    If EnumWindows(AddressOf EnumFunc, 0&= 0 Then
        List1.AddItem 
"枚举出现错误"
    
End If
End Sub
这里说明的是,如果没有将回调函数声明为布尔类型或缺少要求的参数程序运行时将出错,如果回调函数结束时并没有设置返回值,只可获得一个窗口的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值