빌더님 설명을 이해하긴 했지만 막상 구현을 하려하니 어떻게 해야 할지 모르겠습니다.
전 단지 WorkerW를 찾으면 될 줄 알았는데 안되네요.
빌더님 설명을 꼼꼼히 읽어보니 WorkerW -> SHELLDLL_DefView -> SysListView32 의 계층을 갖는 WorkerW를 찾아야 한다고 하셧는데 이걸 어떻게 찾아야 할지 모르겠습니다.
도움 부탁드림니다.
빌더 님이 쓰신 글 :
: 하두고 님이 쓰신 글 :
: : 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번 모니터로
: 이동 하게 된다는 거죠. 멀티모니터 환경도 고려한다면 이 부분에 대한 처리도 필요할 겁니다.
|