하두고 님이 쓰신 글 :
: DC := GetWindow(GetWindow(FindWindow('Progman', nil), GW_CHILD), GW_CHILD);
: Windows.SetParent(handle, DC);
:
: 아시는 분들은 다 아시는 코드인데요.
: Win7 64비트에서는 아예 윈도우가 보이지 않습니다.
: 방법이 없을까요?
:
:
: <추가내용입니다>
: 이것 저것 만지작 거리다 보니 Win7 바탕화면의 테마를 Aero로 놓고
: 이 소스코드를 사용하면 창이 안보이네요.
:
: 기본테마나 고전테마로 놓으면 되고요.
:
: 그런데 웃기는건 기본테마나 고전테마로 놓아 창이 보이게 하고 나서
: 테마를 다시 Aero로 돌려놓으면 창이 그대로 보입니다.
:
: 문제는 재부팅한 후인데요.
:
: Aero테마로 놓고 재부팅을 하면 보였던 창이 다시 안보여요.
: 이거 어떻게 해결해야 할까요?
Aero 테마가 사용되지 않는 경우에는 "Program Manager" Progman 클래스를 패런트로 하는
윈도우 패런트/차일드 관계를 이용해서(Progman -> SHELLDLL_DefView -> SysListView32 )
윈도우 창을 데스크탑 윈도우 레이어에 두는 방법을 사용하면 되지만...
Aero 테마가 사용되면 윈도우즈 시스템이 위와 같은 패런트/차일드 관계를 이용하지 않고 ...
WorkerW 라는 클래스 네임을 갖는 워커 윈도우를 패런트로 해서 아래와 같이 다른 패런트/차일드 관계를
이용하기 때문에...
WorkerW -> SHELLDLL_DefView -> SysListView32
기존의 방법 대신 다른 방법을 이용해야 합니다.
시스템 런타임중에 차일드 윈도우를 갖지 않는 WorkerW 클래스의 다른 윈도우가 있을 수 있으니까
WorkerW 라는 클래스 네임을 갖는 윈도우를 찾되, 위와 같이 SHELLDLL_DefView와 SysListView32를
패런트/차일드 관계로 갖는 WorkerW 계층을 찾아서 해당하는 SysListView32 를 SetParent 로 지정해
주면 됩니다.
데스크탑을 확장해서 이용하는 멀티모니터 환경에서는 패런트/차일드 관계가 바뀌면서 윈도우 Rect 도
확장된 데스크탑 레이어의 좌표계를 따르게 돼 있기 때문에 이 점만 주의하면 됩니다.
가령 1(레프트), 2(라이트) 로 데스크탑을 확장해서 사용하는 듀얼모니터 환경에서...
2번이 주모니터(프라이머리)로 설정되어 있다면 SetParent로 윈도우를 데스크탑 레이어로 세팅하는 순간
해당 윈도우가 확장된 데스크탑의 좌표게를 따라 주모니터인 2번 모니터의 로컬 좌표계에서 1번 모니터로
이동 하게 된다는 거죠. 멀티모니터 환경도 고려한다면 이 부분에 대한 처리도 필요할 겁니다.
|