2013-08-10 4 views

답변

5

계층 구조는 세션 => Window Station => Desktop => Thread => 창입니다. 세션은 서비스로 작업 할 때 중요하며 격리 된 세션 0에서 실행됩니다. 모든 세션에는 적어도 대화 형 윈도우 스테이션 인 WinSta0이 있습니다. 세션 0에는 서비스에 대한 추가 세션이 있습니다.

윈도우 스테이션에는 일반적으로 상호 작용하는 기본 데스크톱과 로그인 및 화면 보호기에 사용되는 안전한 데스크톱 인 Winlogon 데스크톱이 여러 개인 데스크톱이 있습니다. D2 바탕 화면처럼 추가로 추가로 만들 수 있습니다.

바탕 화면에는 창 개체가 저장되는 단일 데스크톱 힙이 있습니다. 모든 HWND는 그 힙에서 고유합니다. GetThreadDesktop()을 사용하여 계층 구조로 돌아가서 알려진 스레드에서 창을 만드는 데스크톱으로 다시 이동해야합니다. EnumDesktopWindows()는 해당 데스크톱이 소유 한 최상위 창을 가져옵니다.

일반적으로 스레드 ID를 얻는 것이 장애가되며 프로세스에 대해 최소한 알 필요가 있습니다. 거기에서 CreateToolhelp32Snapshot()과 같이 해당 프로세스가 소유 한 스레드를 열거 할 수 있습니다.

그러면 데스크톱 핸들이 생깁니다.하지만 GetWindowText는 D1 핸들에서만 작동하므로 D2로 전환하려면 SetThreadDesktop()을 호출해야합니다.

4
  1. EnumWindowStations()
  2. EnumDesktops()이 - 창 역
  3. EnumDesktopWindows() 필요 - 괄호를 필요로 - 데스크톱

(과)

  1. EnumWindows()
  2. EnumChildWindows()가 필요 t 창

위의 기능을 사용하여 테스트를 수행하여 고유한지 확인하십시오. 그들이해야한다고 말하고 싶습니다.

PS : More here.

+0

감사합니다. 당신이 사실이라면, 기본 바탕 화면에서 실행중인 프로세스가 winlogon 바탕 화면에 속한 윈도우의 암호, 즉 암호를 얻지 못하도록하는 방법은 무엇입니까? – xmllmx

+0

@xmllmx [각 창 스테이션은 보안 개체입니다.] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687096 (v = vs.85) .aspx) 나는 그렇게 쉽게 생각하지 않는다. 나는 적어도 당신의 프로세스에 주입하고 키보드를 연결하지 않고도 winlogon 암호를 쉽게 읽을 수 있다고 생각하지 않습니다. 더 나은 대답을 얻지 못하면 몇 가지 검사를해야합니다. – CodeAngry

+0

@xmllmx 또한 체크 아웃 [이 답변은 여기] (http://stackoverflow.com/questions/7308887/is-it-possible-for-2-windows-managed-by-windows-to-have-the-same-window -handle-v/7308916). 사용할 수 있습니다! – CodeAngry

4

HWND는 데스크톱간에 고유합니다.

tagWND 구조체 (별칭 HWND)의

우선 부재이다 _THRDESKHEAD 구조체 (Win32k를 행! tagWND 심볼)

typedef struct tagWND 
    { 
    /*0x000*/  struct _THRDESKHEAD head; 
     /*0x014*/  .............. 

typedef struct _THRDESKHEAD 
{ 
    THROBJHEAD; 
    PDESKTOP rpdesk; //DESKTOP OBJECT 
    PVOID  pSelf; 
} THRDESKHEAD, *PTHRDESKHEAD; 

(ReactOS에 소스로부터)

모든 HWND는 데스크톱 경계에 할당됩니다.