단순하게 szImageName과 동일한 모든 핸들을 vHwnd에 저장하는 모듈

#include <tlhelp32.h>
#include <vector>
using namespace std;

HWND FindWindowHandle;
vector<HWND> vHwnd;

void GetHwnd(LPSTR szImageName);
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

void main()
{
 GetHwnd("notepad.exe");
 
 for(int i=0; i<vHwnd.size(); i++)
 {
  TRACE("%.8x\n", vHwnd[i]);
 }
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
 DWORD pid;
    GetWindowThreadProcessId(hwnd,&pid);
    if((DWORD)lParam==pid)// && IsWindowVisible(hwnd))
    {
#if defined(_DEBUG)
        TCHAR name[255]={0,};
        GetWindowText(hwnd,name,255);
        TRACE("%s 0x%08x(%d) 0x%08x(%d)\n",name, hwnd,hwnd,pid,pid);
#endif
        FindWindowHandle = hwnd;
        return false;
    }
    return true;
}

void GetHwnd(LPSTR szImageName)
{
 
 PROCESSENTRY32 pe;
 HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

 vHwnd.clear();

 if (!hSnapshot)
 {
  ::MessageBoxA(NULL, "CreateToolhelp32Snapshot() : Fail!", NULL,NULL);
 }
 
 ULONG count=0;
 
 pe.dwSize=sizeof(PROCESSENTRY32);
 BOOL retval=Process32First(hSnapshot,&pe);
 do
 {
  if(strcmp(pe.szExeFile, szImageName)==0)
  {
   if(::EnumWindows(&EnumWindowsProc,(LPARAM)pe.th32ProcessID)==false)
   {
    vHwnd.push_back(FindWindowHandle);
   }
  }
  count++;
 }while(Process32Next(hSnapshot,&pe));
 
 CloseHandle(hSnapshot);
}

 

Posted by 띠깜
,