我想用VC6开发这样的一个小程序
运行时
只用一个对话框
其上有一个按钮和一个LISTBOX
我希望点击按钮后,LISTBOX就列出当前屏幕上所有可见的窗口的句柄或着窗口标题
(主要是取得正在运行中的其他程序的窗口)
我的做法如下:struct tagList
{
   char aHandle[200];
   tagList *pNext;
};tagList *pHead;pHead=NULL;//下面的EnumWindowsProc函数,不论我用成员函数,还是独立的函数,都通不过编译
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    tagList *pNew=new tagList;
    sprintf(pNew->aHandle,"%d",hwnd);    pNew->pNext=pHead;
    pHead=pNew;    return TRUE;
}void CEnumWinDlg::OnButton1() 
{
    GetAllWindow()//我想在这里把前面链表的内容写入LISTBOX中,不知道怎么弄
}void CEnumWinDlg::GetAllWindow()
{
     EnumWindows(&EnumWindowProc,0);
}

解决方案 »

  1.   

    EnumWindows(&EnumWindowProc,0);//&不要
    写出来的东东要放到回调函数中
      

  2.   

    MFC下,先将那个listbox关联到m_List;BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
        char szText[256];
        sprintf(szText,"%x",hwnd);
        m_List.AddString(szText);
    }SDK下,假设你的dialog的句柄是hDlg. 你的listbox的ID是IDC_LISTBOX;BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
        
        char szText[256];
        sprintf(szText,"%x",hwnd);
        
        HWND hList=GetDlgItem(hDlg,IDC_LISTBOX);
        SendMessage(hList,LB_ADDSTRING,0,(LPARAM)szText);
    }至于你的那个链表,可有可无,你如果要对所得到的HWND要进行其他操作,你就自己加上吧.
      

  3.   

    关于
    EnumWindows(&EnumWindowProc,0);//我把&放这里,报错:
    D:\GOOD\enumWin\enumWinDlg.cpp(183) : error C2276: '&' : illegal operation on bound member function expression我把&拿掉,报错:
    D:\GOOD\enumWin\enumWinDlg.cpp(183) : error C2664: 'EnumWindows' : cannot convert parameter 1 from 'int (struct HWND__ *,long)' to 'int (__stdcall *)(struct HWND__ *,long)'
      

  4.   

    调用API函数,一定要在前面加::吗比如我看到代码中有GetDlgItem
    请问他是API,还是CWnd的成员
    关于SendMessage(hList,LB_ADDSTRING,0,(LPARAM)szText);
    报错:
    D:\GOOD\enumWin\enumWinDlg.cpp(192) : error C2660: 'SendMessageA' : function does not take 4 parameters
      

  5.   

    1. EnumWindows(EnumWindowProc,0)没有那个"&". 你的错误是因为在声明EnumWindowsProc函数时前面没有加上CALLBACK.
    2. 提示SendMessage()不接受4个参数的原因是你在MFC下调用了SDK下的WIN API函数了.