구형 Delphi Compiler 를 사용하는 본인의 경우엔, windows7 의 DWM 이나 달라진 메시지 처리 등을 해야 합니다.
특히 ALT 키가 눌려졌을 경우 기존 윈도우 시스템과 달리, WM_UPDATEUISTATE 와 같은 메시지 처리는 필히 해 주지 않으면, 각 컨트롤 (버튼과 같은) 이 사라져 버리는 둥의 어처구니 없는 경우를 격게 됩니다.

대부분의 Delphi 프로그래머 들은 상위의 컴파일러와 IDE 를 구비하고 있겠지만, 저와 같은 서민층의 불쌍한 프로그래머들은 고가의 Delphi 를 구매할 여력이 없습니다.
그래서 개인에게 License 를 배포 받아 쓸 수 있는 (기간이 제한적인) Enterprise 버젼을 쓰는 분들이 더러 있을 겁니다.
기본적으로 Pre-compile 된 component 는 삭제를 해서 쓰더라도, 추가적인 component 의 설치가 불가능한 것을 고려 할때, 이미 잘 만들어 져 나오는 상위 버젼의 기능들을 손가락만 빨며 쳐다 볼 수는 없을 노릇일 겁니다.

그래서 몇가지 windows vista 와 7 에서 처리 해 주어야 할 점들을 정리 해 보았습니다.
windows7 프로그래밍을 구 버젼의 delphi 에서 하시는 분들에게 큰 도움이 되었으면 좋겠으며,
이 정보는 http://www.installationexcellence.com/articles/VistaWithDelphi/Original/Index.html 에서 처음 발견한 부분들을 재정리 한 수준 입니다.

먼저 Windows version 알기.
왜 Windows version 을 알아야 하냐면, Windows vista 와 7 (또는 그 이후의 버젼의 OS) 에서 처리와 이전 버젼 처리가 다르기 때문 입니다. 기본적으로 구버젼의 delphi 들은 구버젼의 windows 에 최적화 되어 있을 것 입니다.
그에 반면, vista/7 의 경우만 뭔가를 처리 하도록 하면 되는 부분이 많기 때문에 현재 Windows version 을 알아서, 필요한 때에만 처리하도록 하면, 호환성이 좋은 Windows application 을 만들 수 있게 됩니다.

먼저 위와 같이 두개의 인자를 준비 해 줍니다.
보통 project 파일에서 하셔도 되고, MainForm 생성 부분에 하셔도 됩니다.
저는 전역 변수로 지정을 하여 두록 하였습니다.

그런 다음 다음과 같이 pas 파일 마지막에 있는 end. 앞에 최초 구동이 되도록 변경을 해 줍니다.
 
이제 NT version 6 이상 (Vista 와 7 의 경우) 임을 알게 된 경우엔 IsNT6above 의 boolean 함수가 true 가 됨 으로서, 해당 flag 를 감지 하여, 별도의 처리를 할 수 있게 됩니다.

FormCreate() 에서 윈도우 속성 바꾸기.
기본적으로 Delphi application 은 Application 이라는 숨어 있는 윈도우가 있습니다.
이 윈도우 때문에 Windows vista 이상 에서는 Alt+TAB 이 아닌 WindowsKey + TAB 을 누를시 3D 창 전환 화면에 어플리케이션이 나타나지 않는 기현상이 발생 합니다.
이를 해결 하기 위해서는 첫재, FormCreate() 함수 내에 다음 부분을 집어 넣도록 합니다.


그런다음 필요 한 것이 추가적인 함수 등록 입니다.
FormClass 에 다음을 추가 해 줍니다.

위 코드를 거치게 되면 3D 창 전환이나, DWM 상에 윈도우 썸네일 표시등이 올바르게 표시 되게 됩니다.
이 코드 외에 DWM 은 별도의 DWM API 를 importing 해서 쓰거나, 윈도우 자체 폰트의 핸들을 받아 처리 하는 등의 추가적인 방법들은 개발자 취향에 맞게 변경 할 수 있어 보입니다.

Posted by 견족자K rageworx