只知道窗口标题的一部分,如何找到其句柄
发布网友
发布时间:2023-12-11 08:38
我来回答
共1个回答
热心网友
时间:2024-03-04 19:42
这事情我做过。原理是:枚举桌面上所有窗口,取他们的标题看是否符合搜索条件。以下是我的 FindWindowByPart()源程序。
HWND FindWindowByPart(char *str)
str:窗口标题的已知部分;
返回:桌面上第一个符合搜索条件的窗口句柄。
需要说明的是,这个函数假设标题的已知部分是标题的开始部分。如果不一定是开始部分,需要把
if (strncmp(buf, ((MYPARM *)p)->str, strlen(((MYPARM *)p)->str))==0)
修改为:
if (strstr(buf, ((MYPARM *)p)->str)!=NULL)
但要注意不能用我提供的main(int argc, char *argv[])来测试,因为用argv[]传递的话,这个测试程序的标题可能含有目标窗口标题的已知部分,从而返回测试程序的窗口句柄。也就是说不能用argv[]或lpCmdLine传递这个参数。
#include <windows.h>
#include <string.h>
typedef struct {
HWND hwnd;
char *str;
} MYPARM;
BOOL CALLBACK IsNotThisWindow(HWND hwnd, LPARAM p)
{
int len;
char buf[256];
len = GetWindowTextLength(hwnd);
if (len) {
GetWindowText(hwnd, buf, 256);
if (strncmp(buf, ((MYPARM *)p)->str, strlen(((MYPARM *)p)->str))==0) {
((MYPARM *)p)->hwnd = hwnd;
return FALSE;
}
}
return TRUE;
}
HWND FindWindowByPart(char *str)
{
MYPARM pm ;
pm.hwnd = NULL;
pm.str = str;
EnumWindows(IsNotThisWindow, (LPARAM)&pm);
return pm.hwnd;
}
/******************************************************
测试用的主程序:fwin.c
用法:fwin [窗口标题的开头部分]
******************************************************/
int main(int argc, char *argv[])
{
HWND hwnd = NULL;
if (argc>1) hwnd = FindWindowByPart(argv[1]);
if (hwnd) {
char buf[256];
GetWindowText(hwnd, buf, 256);
printf("Found Window, Caption=\"%s\".\n", buf);
}
return 0;
}