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