各位大侠帮帮忙  小弟初学vc   
如何获取只有在任务管理器中显示出来的应用程序的句柄呀

解决方案 »

  1.   

    进程还是性能中的句柄?你可以从1-65535或更高,用api校验是不是一个句柄。
      

  2.   

      HANDLE           hProcessSnap       =   NULL;   
      PROCESSENTRY32   pe32               =   {0};   
      hProcessSnap   =(HANDLE)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);   
      pe32.dwSize   =   sizeof(PROCESSENTRY32);     
      Process32First(hProcessSnap,   &pe32);   
      do   
      {         
              
            ProcessID=pe32.th32ProcessID;   
            HANDLE   hh=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);//取得进程句柄   
               
       }   
      while   (Process32Next(hProcessSnap,   &pe32));     CloseHandle   (hProcessSnap);
      

  3.   

    应用程序的什么句柄?进程的?还是窗口的?还是GDI的?
      

  4.   

    我这里有个任务管理器的源代码,你可以参考一下。
    http://download.csdn.net/source/529874
      

  5.   

    用EnumWindows,或者FindWindowEx。
      

  6.   


    #include <windows.h>BOOL CALLBACK wndProc(HWND hWnd, LPARAM)
    {
    if ((::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE) && (::GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE))
    {
    char name[260];
    ::GetWindowText(hWnd, name, sizeof(name));
    printf("%s\r\n", name);
    }
    return TRUE;
    }int main(int argc, char* argv[])
    {
    ::EnumWindows(wndProc, NULL);
    system("PAUSE");
    return 0;
    }
    目前限制到这种程度了,VS比较特殊,会有两个窗口,经过测试发现VS的任务栏窗口和桌面窗口是不同的窗口,导致这种方法找到了两个VS窗口。
      

  7.   

    (::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE)
    不起作用   不在任务管理器“应用程序”栏中显示的窗口   也能得到窗口句柄
    我现在的程序是枚举了所有显示的窗口   但需要屏蔽掉任务管理器“应用程序”栏中没有显示的那些   不知道怎么改  
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    if(::GetWindowLong(hwnd,GWL_STYLE)& WS_VISIBLE)
    {
    char szClassName[128] = {0};
    if(GetClassName(hwnd,szClassName,128))
    {
    if(stricmp(szClassName, "HNC_SCREEN_CLASS") != 0)
    {
    g_hwndFind[m_num] = hwnd
    ::ShowWindow(g_hwndFind[m_num],SW_HIDE);
    m_num++;//count start
    }
    }

    }
    return TRUE;
    }
      

  8.   

    上面的太乱了  重发
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    if(::GetWindowLong(hwnd,GWL_STYLE)& WS_VISIBLE)
    {
    char szClassName[128] = {0};
    if(GetClassName(hwnd,szClassName,128))
    {
    if(stricmp(szClassName, "HNC_SCREEN_CLASS") != 0)
    {
    g_hwndFind[m_num] = hwnd;//record the HWND handle into array ::ShowWindow(g_hwndFind[m_num],SW_HIDE);
    m_num++;//count start
    }
    }
    }
    return TRUE;
    }
      

  9.   

    GetWindowLong给GWL_HWNDPARENT参数,判断返回值不为0的过滤掉。
      

  10.   


    我用自己的机器测试过,开着IE、VS、QQ聊天框,控制台,全都认出来了,而(::GetParent(hWnd) == NULL)过滤不了多少东西,如果你还有其他的窗口没有过滤掉,你可以考虑再增加一些判断啊!话说你说的是什么东西的窗口没给过滤掉,说出来听听……
      

  11.   


    机上没有瑞星,不过也有一个窗口有这种情况,加上(::GetParent(hWnd) == NULL)就过滤掉了,也就是
    if ((::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE) && (::GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE) && (::GetParent(hWnd) == NULL))