2011-09-01 4 views
15

VC++에서는 EnumWindows (...), GetWindow (...) 및 GetWindowLong()을 사용하여 창 목록을 가져오고 창이 최상위 창 (소유자가 아닌 다른 창)인지 확인하고 창이 표시됩니다 (WS_VISIBLE). 그러나, 내 바탕 화면이 단 5 개의 창을 보여주고 있지만이 EnumWindows는 50 개의 창을 제공합니다. 얼마나 재미 있습니까? 모든 Windows 괴짜가 여기에 명확히 도와주세요.EnumWindows가 예상보다 많은 윈도우를 반환하는 이유는 무엇입니까?

+1

내가 심지어 윈도우 C를 보았다 alled "start button" – jondinham

+7

시작 버튼이 창이기 때문입니다. –

답변

27

(Alt-Tab을 상자에 또는 유사)에만 작업 표시 줄에 창을 나열하는 방법은 MSDN 블로그에이 문서에서 레이몬드에 의해 설명되어 있습니다 :
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

을 그리고 이것은 여부를 확인하는 슈퍼 기능입니다 창은 고도 탭에 표시됩니다 : 여기에 소스 코드를 적립

BOOL IsAltTabWindow(HWND hwnd) 
{ 
    TITLEBARINFO ti; 
    HWND hwndTry, hwndWalk = NULL; 

    if(!IsWindowVisible(hwnd)) 
     return FALSE; 

    hwndTry = GetAncestor(hwnd, GA_ROOTOWNER); 
    while(hwndTry != hwndWalk) 
    { 
     hwndWalk = hwndTry; 
     hwndTry = GetLastActivePopup(hwndWalk); 
     if(IsWindowVisible(hwndTry)) 
      break; 
    } 
    if(hwndWalk != hwnd) 
     return FALSE; 

    // the following removes some task tray programs and "Program Manager" 
    ti.cbSize = sizeof(ti); 
    GetTitleBarInfo(hwnd, &ti); 
    if(ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) 
     return FALSE; 

    // Tool windows should not be displayed either, these do not appear in the 
    // task bar. 
    if(GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) 
     return FALSE; 

    return TRUE; 
} 

:
http://www.dfcd.net/projects/switcher/switcher.c

+1

누구든지이 함수가 레이몬드 (Raymond)가 블로그 게시물에 언급 한 'WS_EX_TOOLWINDOW' 및'WS_EX_APPWINDOW' 확장 스타일 사례를 고려하지 않는 이유를 알고 계십니까? 'STATE_SYSTEM_INVISIBLE'이 그것을 다루고 있습니까, 아니면이 기능이 레이몬드가 묘사 한 것과 정확히 일치하지 않습니까? –

+0

@adamsmith toolwindow는 상단 창이 아니며 작업 표시 줄 또는 alt-tab 메뉴에 표시되지 않습니다. toolwindow의 부모 윈도우가 null이 아니기 때문에 – jondinham

+5

추가적인 개선점은리스트에서 툴 윈도우를 제거하는 것입니다. @DavidHeffernan이 다른 대답에서 언급했듯이이 문서는 [다음 MSDN 문서에서] (http : //http//msdn.microsoft.com/en-us/library/aa969325.aspx)에 설명되어 있습니다.체크와 함께 위의 코드를 개선했습니다 : 'if (GetWindowLong (hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) FALSE를 반환합니다. –

3

X 버튼과 제목 표시 줄 등 당신이 말하는 창은 유일한 종류의 창이 아닙니다. 버튼, 드롭 다운 메뉴, 레이블, 아이콘, 텍스트 상자, 작업 표시 줄, 그리고 그 밖의 모든 것들도 창문입니다. . 그래서 EnumWindows은해야 할 일을 정확히 수행하고 있습니다 : 모든 최상위 창을 열거하십시오.

이 경우에도 EnumWindows은 최상위 창만 열거합니다. 즉 it won't enumerate any child windows 의미

EnumWindows 함수는 WS_CHILD 스타일이 시스템에 의해 소유 몇 최상위 창을 제외하고, 자식 창을 열거하지 않습니다.

그러나 데스크톱의 많은 항목은 생각하고있는 "창"뿐만 아니라 창입니다.

+0

관련이없는 "소위"창을 없애기위한 아이디어는 없습니까? 난 단지 보이는 창 (응용 프로그램 창, 대화 상자가 아닌 버튼 등의 목록)을 원합니다. – jondinham

+2

[작업 표시 줄에 나타나는 창]이 필요합니다 (http : // http : //msdn.microsoft.com/ko -us/library/aa969325.aspx). "셸은 응용 프로그램이 소유하지 않은 창을 만들 때마다 작업 표시 줄에 단추를 만듭니다. 창 단추가 작업 표시 줄에 배치되도록하려면 WS_EX_APPWINDOW 확장 스타일이 포함 된 소유되지 않은 창을 만드십시오. 작업 표시 줄에 배치 된 WS_EX_TOOLWINDOW 확장 스타일이있는 소유되지 않은 창을 만듭니다. 대신 숨겨진 창을 만들어이 숨겨진 창을 보이는 창 소유자로 만들 수 있습니다. " –

+0

예, 작업 표시 줄에 나타나는 창 목록을 원합니다. 나는 숨기는 방법을 알고, 다른 모드에서 창을 보여줍니다. 하지만이 목록을 얻는 방법을 모르겠다 – jondinham

관련 문제