//---------------------------------------------------------------------------
// 현재 실행된 창이 있는 프로그램을 스캔한다.
// 결과 윈도 제목과 핸들은 ListBox에 세팅한다.
void TFormMain::ReScan()
{
TListBox *LB = ListBox1;
LB->Items->Clear();
char szText[400];
HWND hwnd = GetTopWindow(NULL);
while(hwnd != NULL)
{
if (::GetParent(hwnd) != NULL) ;
else if (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) ;
else if (! IsWindowVisible(hwnd)) ;
else if ((hwnd == Application->Handle) || (hwnd == Handle)) ; // 자신 제외
else
{
GetWindowText(hwnd, szText, 400);
LB->Items->AddObject(szText, (TObject*)hwnd);
}
hwnd = GetWindow(hwnd, GW_HWNDNEXT);
}
}
//---------------------------------------------------------------------------
|
목적이 Windows 작업관리자의 응용 프로그램 탭에 리스트처럼 나오도록 하는것이 목적이죠?
위코드로 하면 Builder 6 의 경우 3개 이상 뜨네요 (Windows XP)
Delphi나 Builder로 만든 프로그램에서 메인폼 이외에 Form을 Show 해놓은 상태라면..
Show해놓은 갯수만큼...
if (::GetParent(hwnd) != NULL) ;
생각건데 GetParent 가 NULL인것 중에 찾을것이 아니라
GetWindowLong(hwnd,GWL_HWNDPARENT) 가 NULL 인것 중에서 찾아야 할것 같구..
자신을 제외 하는것두..
자신에 MainForm 이외에 sub폼이 있을수 있으니 바로밑에 팁에
GetWindowThreadProcessId 함수를 이용하여
Processid가 GetCurrentProcessId 같지 않는지 비교하는것이 확실할듯 합니다.
그렇게 하니 XP에서는 작업관리자의 응용 프로그램 탭에 있는것과 비슷하게 나오네요
그럼