C++ Builder 高手进阶
(七)如何设计系统环境监控程序
你想实时掌握系统资源吗?比如,当前窗口、磁盘及内存使用情况、设备及环境变量设置情况、正在运行的程序及开机启动程序等。通过我的系列介绍,相信你一定可以深入地了解这些信息,并可随意地通过编程来控制它。
一、如何获取当前窗口
这里需要一个API函数:EnumWindows。
函数功能:该函数枚举所有屏幕上的顶层窗口,办法是先将句柄传给每一个窗口,然后再传送给应用程序定义的回调函数。EnumThreadWindows函数继续到所有顶层窗口枚举完为止或回调函数返回FALSE为止函数原型:BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);
参数:
lpEnumFunc:指向一个应用程序定义的回调函数指针,请参看EnumWindowsProc。
lPararm:指定一个传递给回调函数的应用程序定义值。
返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
备注:EnumWindows函数不列举子窗口。
在循环体中调用这个函数比调用GetWindow函数更可靠。调用GetWindow函数中执行这个任务的应用程序可能会陷入死循环或指向一个已被销毁的窗口的句柄。
我编写的回调函数:bool __stdcall EnumProc(HWND hWnd,long lp);//详细定义如下:
bool __stdcall EnumProc(HWND hWnd,long lp)
{
if(hWnd==NULL) return false;//如果指定的窗口句柄为空,则退出
char title[60]; //保存窗口标题
char hwndStr[10]; //保存窗口句柄
char className[60];//保存类名
TListItem *mItem;//用来存储窗口信息:窗口标题、句柄及类名
GetWindowText(hWnd,title,60);//取得指定窗口句柄的窗口标题
if (AnsiString(title)!= "" && AnsiString(title)!= "Default IME")
{//如果窗口标题不为空且不是输入法标题,则
mItem=MainForm->ListView1->Items->Add();//添加该窗口信息到列表中
sprintf(hwndStr,"%08x",hWnd);//将窗口句柄转化为16进制
mItem->Caption=AnsiString(title);
mItem->SubItems->Add(AnsiString(hwndStr));//添加窗口句柄
GetClassName(hWnd,className,60);//取得类名
mItem->SubItems->Add(AnsiString(className));//添加类名
}
return true;
}
获取当前窗口:EnumWindows((WNDENUMPROC)EnumProc,0);
《未完待续》
本文地址:http://com.8s8s.com/it/it29394.htm