注册 登录
编程论坛 VC++/MFC

EnumWindows 函数怎么让用户自定义参数呢

a278401627 发布于 2012-12-23 12:27, 967 次点击
BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam);


BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam)
{

    int nLen = ::GetWindowTextLength(hwnd) + 1;

   LPTSTR Caption = new TCHAR[nLen];
    ::GetWindowText(hwnd, Caption, nLen);


TCHAR szBuf[256]={0};
   if (!::lstrcmp(Caption,"无标题 - 记事本"))
    {
       // cout << (long)hwnd << endl;
char szTmp[20];
    wsprintf(szTmp,_T("%d|"),(HWND)hwnd);
wsprintf(szTmp,_T("%c|"),Caption);
    strcat(szBuf,szTmp);


}
szBuf[strlen(szBuf)]='\0';


 delete[] Caption;
    return TRUE;
}


int main ()

{

::EnumWindows(EnumWindowsProc,NULL);


return 0;
}



以上是我的代码   我通过EnumWindows 来得到 ,标题是 ,"无标题 - 记事本" 的所有的窗口句柄

现在的问题是 怎么让用户自己来定义窗口标题   也就是说要让 ,"无标题 - 记事本" 变成一个参数。


4 回复
#2
yuccn2012-12-23 16:14
通过LPARAM lParam 这个参数传进去就行了。
int main ()
{

char Text[128] = { "无标题 - 记事本" };

::EnumWindows(EnumWindowsProc,(LPARAM)Text);

return 0;
 }

BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam)
{
    char *pParam = (char *)lParam;

    // pParam 就是你传进来的那个参数了,也就是main中的那个Text[128] = { "无标题 - 记事本" };
   
}
 
#3
a2784016272012-12-23 22:22
谢谢版主,我解决这个问题了

现在出现另一个问题是 EnumWindowsProc 执行完后,得到了我需要的句柄

那要怎么才能在int main () 中把句柄接收回来呢

#4
yuccn2012-12-24 12:22
一样的,你可以定义一个结构体,
比如
typedef struct _EWP_PARAM {
    char szText[128]; // 这个地方传入 枚举的窗口标题
    HWND hwnd;
} EWP_PARAM, *PEWP_PARAM ;

int main ()
 {
   EWP_PARAM ep = { 0 };
   //初始化你的ep结构体
 
   ::EnumWindows(EnumWindowsProc,(LPARAM)ep);

   // 如果找到你要查找的窗口 那么它就被填充在ep.hwnd 带回来了
 
return 0;
 }

BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam)
 {
     EWP_PARAM *pParam = (EWP_PARAM *)lParam;
     // pParam->szText 是你要查找的窗口名
     if (找到你要查找的窗口) {
         pParam->hwnd = hwnd;
         return FALSE; // return false 是指不再继续枚举窗口了。如果你不知道 可以查询msdn
     }     
}


[ 本帖最后由 yuccn 于 2012-12-24 12:26 编辑 ]
#5
mmmmmmmmmmmm2012-12-24 13:28
学习一下
1