VC++에서는 EnumWindows (...), GetWindow (...) 및 GetWindowLong()을 사용하여 창 목록을 가져오고 창이 최상위 창 (소유자가 아닌 다른 창)인지 확인하고 창이 표시됩니다 (WS_VISIBLE). 그러나, 내 바탕 화면이 단 5 개의 창을 보여주고 있지만이 EnumWindows는 50 개의 창을 제공합니다. 얼마나 재미 있습니까? 모든 Windows 괴짜가 여기에 명확히 도와주세요.EnumWindows가 예상보다 많은 윈도우를 반환하는 이유는 무엇입니까?
답변
(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;
}
누구든지이 함수가 레이몬드 (Raymond)가 블로그 게시물에 언급 한 'WS_EX_TOOLWINDOW' 및'WS_EX_APPWINDOW' 확장 스타일 사례를 고려하지 않는 이유를 알고 계십니까? 'STATE_SYSTEM_INVISIBLE'이 그것을 다루고 있습니까, 아니면이 기능이 레이몬드가 묘사 한 것과 정확히 일치하지 않습니까? –
@adamsmith toolwindow는 상단 창이 아니며 작업 표시 줄 또는 alt-tab 메뉴에 표시되지 않습니다. toolwindow의 부모 윈도우가 null이 아니기 때문에 – jondinham
추가적인 개선점은리스트에서 툴 윈도우를 제거하는 것입니다. @DavidHeffernan이 다른 대답에서 언급했듯이이 문서는 [다음 MSDN 문서에서] (http : //http//msdn.microsoft.com/en-us/library/aa969325.aspx)에 설명되어 있습니다.체크와 함께 위의 코드를 개선했습니다 : 'if (GetWindowLong (hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) FALSE를 반환합니다. –
X 버튼과 제목 표시 줄 등 당신이 말하는 창은 유일한 종류의 창이 아닙니다. 버튼, 드롭 다운 메뉴, 레이블, 아이콘, 텍스트 상자, 작업 표시 줄, 그리고 그 밖의 모든 것들도 창문입니다. . 그래서 EnumWindows
은해야 할 일을 정확히 수행하고 있습니다 : 모든 최상위 창을 열거하십시오.
이 경우에도 EnumWindows
은 최상위 창만 열거합니다. 즉 it won't enumerate any child windows 의미
EnumWindows 함수는 WS_CHILD 스타일이 시스템에 의해 소유 몇 최상위 창을 제외하고, 자식 창을 열거하지 않습니다.
그러나 데스크톱의 많은 항목은 생각하고있는 "창"뿐만 아니라 창입니다.
관련이없는 "소위"창을 없애기위한 아이디어는 없습니까? 난 단지 보이는 창 (응용 프로그램 창, 대화 상자가 아닌 버튼 등의 목록)을 원합니다. – jondinham
[작업 표시 줄에 나타나는 창]이 필요합니다 (http : // http : //msdn.microsoft.com/ko -us/library/aa969325.aspx). "셸은 응용 프로그램이 소유하지 않은 창을 만들 때마다 작업 표시 줄에 단추를 만듭니다. 창 단추가 작업 표시 줄에 배치되도록하려면 WS_EX_APPWINDOW 확장 스타일이 포함 된 소유되지 않은 창을 만드십시오. 작업 표시 줄에 배치 된 WS_EX_TOOLWINDOW 확장 스타일이있는 소유되지 않은 창을 만듭니다. 대신 숨겨진 창을 만들어이 숨겨진 창을 보이는 창 소유자로 만들 수 있습니다. " –
예, 작업 표시 줄에 나타나는 창 목록을 원합니다. 나는 숨기는 방법을 알고, 다른 모드에서 창을 보여줍니다. 하지만이 목록을 얻는 방법을 모르겠다 – jondinham
- 1. C# WinForms : 예상보다 많은 것을 실행하는 함수
- 2. 이 MySQL JOIN 문이 더 많은 결과를 반환하는 이유는 무엇입니까?
- 3. InnoDB 테이블 크기가 예상보다 훨씬 큰 이유는 무엇입니까?
- 4. SetWindowsHookEx가 0을 반환하는 이유는 무엇입니까?
- 5. AlphaBlend가 'false'를 반환하는 이유는 무엇입니까
- 6. real_connect가 null을 반환하는 이유는 무엇입니까?
- 7. BitmapFactory.decodeFile이 null을 반환하는 이유는 무엇입니까?
- 8. Type.GetElementType이 null을 반환하는 이유는 무엇입니까?
- 9. NSDateFormatter가 nil을 반환하는 이유는 무엇입니까?
- 10. GetCurrentProcess가 -1을 반환하는 이유는 무엇입니까?
- 11. Exception.fillInStackTrace가 Throwable을 반환하는 이유는 무엇입니까?
- 12. corrcoef가 매트릭스를 반환하는 이유는 무엇입니까?
- 13. NSDateFormatter가 nil을 반환하는 이유는 무엇입니까?
- 14. ItemContainerGenerator가 null을 반환하는 이유는 무엇입니까?
- 15. NSMutableArray가 nill을 반환하는 이유는 무엇입니까?
- 16. boost :: bind를 사용하여 예상보다 많은 인수를 안전하게 전달합니까?
- 17. Runnable이 예상보다 느리게 실행 중입니다.
- 18. 코코아가 가끔 빈 문자열을 반환하는 이유는 무엇입니까?
- 19. Win32 OleGetClipboard() 함수가 CLIPBRD_E_CANT_OPEN을 반환하는 이유는 무엇입니까?
- 20. ie8의 사용자 에이전트가 'opera'를 반환하는 이유는 무엇입니까?
- 21. 내 XPathNavigator가 항상 루트를 반환하는 이유는 무엇입니까?
- 22. 이 함수가 항상 0을 반환하는 이유는 무엇입니까?
- 23. 이 변수가 항상 true를 반환하는 이유는 무엇입니까?
- 24. YAML.load가 잘못된 숫자 값을 반환하는 이유는 무엇입니까?
- 25. CreateDialog가 실패했으나 GetLastError가 0을 반환하는 이유는 무엇입니까?
- 26. 함수 파일이 빈 배열을 반환하는 이유는 무엇입니까?
- 27. Geocoder.getFromLocationName (...)이 빈 목록을 반환하는 이유는 무엇입니까?
- 28. CoreAudio : ExtAudioFileCreateWithURL이 0xFFFFFFCE를 반환하는 이유는 무엇입니까?
- 29. MarshalByRefObject.InitializeLifetimeService가 ILease가 아닌 개체를 반환하는 이유는 무엇입니까?
- 30. Grails의 cookieService.get이 항상 null을 반환하는 이유는 무엇입니까?
내가 심지어 윈도우 C를 보았다 alled "start button" – jondinham
시작 버튼이 창이기 때문입니다. –