TaskSwitchXP 코드 :: 2006/08/16 13:19


TaskSwitchXP Start Panel style

XP 사용자라면 아마도 TaskSwitchXP라는 프로그램을 아실 겁니다.alt + tab을 강화시킨 유틸리티죠~ 전 이것을 사용하진 않는데 용량을 별로 차지 하지도 않고 괜찮다길래 다운받아서 설치해봤습니다. 음~ 괜찮은 것 같네요. 그런데 이 놈이 재미난 사실은 소스 코드까지 공개라는 점 입니다.

http://www.ntwind.com/ 에 가시면 소스 코드를 다운 받아서 보실 수 있습니다. 홈페이지를 조금 살펴보면 알 수 있지만 회사도 아니고 대학생이 취미생활로 개발한 것을 올리는 사이트 같더군요~ ^^ 하여튼 궁금하기도 하고 심심하기도 해서 소스 코드를 다운 받아서 좀 살펴봤습니다.

사실 전 alt + tab 전환에 엄청난 뭔가 비밀이 숨겨져 있는 줄 알았는데 알고 봤더니 ㅎㅎ~ RegisterHotkey더군요~ 메뉴에 보면 다른 방식으로 자판을 가로채는 메뉴가 있는데 그걸 활성화 하면 WH_KEYBOARD_LL훅을 사용하는 것 같습니다. 생각보다 간단한 방법이더군요. TaskSwitchXP가 XP이상만 지원 하기에 그동안 저는 alt + tab을 대신하는 뭔가가 있는 줄 알았습니다. 해당 사이트의 faq를 읽어보면 알겠지만 2000을 지원하지 않는 이유는 PrintWindow란 API 때문이더군요. 이 API가 XP이상에서만 지원하기 때문입니다. 아마도 이 놈만 작성해주면 2000에서 동작하게 하는데도 큰 문제는 없을 것 같네요~ 물론 해보진 않았습니다. ㅋㅋ-

코드는 다른 부분에서도 재미난 아이디어를 많이 볼 수 있습니다. 한 가지 재미난 기능은 특정 프로그램을 트레이로 최소화 시키는 기능입니다. 어떻게 구현했을까 궁금했는데 살펴보니 트레이로 내려가는 애니메이션을 보여준후 해당 윈도우를 숨기더군요. 그리고는 자신이 트레이에 아이콘을 등록합니다. 자신에게 메시지가 오면 해당 윈도우를 다시 보여주는 것이죠~

코드는 정말 그의 프로그래밍 철학을 보여주듯이 굉장히 힘들고 어렵게 작성되어 있습니다. 순수 API로 작성되어 있고, 최적화 부분에 많은 신경을 쓴 듯한 느낌이더군요. 이해되지 않는 부분은 부동 소수 연산을 인라인 어셈블리로 작성해 두었는데 그게 과연 그럴 필요가 있을까? 하는 생각이 들었습니다.

이런 프로그램의 동작 원리가 궁금하신 분들은 소스를 읽어보는 것도 많은 도움이 될 것 같습니다. 좋은 소스를 공개해준 Alexander Avdonin님께 감사의 뜻을 전하고 싶네용~ 개발자가 코드를 공개한다는 일은 정말 쉽지 않은 일이죠~
스폰서
글타래

  • 2주간 인기 글
  • 2주간 인기글이 없습니다.
Trackback Address :: http://jiniya.net/tt/trackback/275
  • Gravatar Image.
    Wiziple | 2006/08/16 16:04 | PERMALINK | EDIT/DEL | REPLY

    Task Switch XP Code... 저도 예전부터 보관하고 있었습니다:D
    Task Switch XP에서 PrintWindow가 사용된 부분이 아마 썸네일로 윈도우를 출력하는 부분일겁니다;
    윈도우에 포커스가 없거나 다른 윈도우에 가려져도 WM_PRINT 메시지를 이용하여 윈도우를 캡쳐할 수 있어 제가 프로그램을 만들때 상당히 도움되었었는데....
    근데...

    근데... 이 함수가 xp에서만 동작하나요? ㅜㅠ .................
    진행중인 프로젝트에 PrintWindow 함수가 쓰이고 있었는데........
    알려주셔서 감사합니다 ㅋㅋ

    CodeWiz님아니었으면 버그 만들뻔했군요 ㅎㅎ 감사합니다:D

    • Gravatar Image.
      codewiz | 2006/08/17 02:07 | PERMALINK | EDIT/DEL

      PrintWindow란 API 생각보다 재미난 녀석이네요. 몇 가지 심오한 문제를 모두 한 방에 해결해주는 녀석이군요. 화면에 표시되지 않는 부분도 모두 정확하게 그려주네요.

      WM_PRINT 메시지의 경우 메시지를 받는 윈도우 측에서 처리가 되어 있지 않으면 정상적으로 그려지지 않습니다. 보통의 경우 WM_PAINT에서 단순히 BeginPaint로 처리하기 때문에 WM_PRINT를 사용해도 캡쳐되지 않는 윈도우가 대부분입니다. 하지만 PrintWindow는 특별한 처리를 해주지 않은 프로그램들도 정상적으로 캡쳐되는 것으로 보아서 하부에서 뭔가 작업을 해주는 것 같네요~

      처음에 PrintWindow같은 API때문에 2000을 지원하지 않는다고 다소 의아하게 생각했었는데 해당 API를 2000 시스템에서 구현하기가 그리 쉬울 것 같지는 않네요. 물론 API 후킹을 통해서 BeginPaint, EndPaint등을 후킹 한다면 불가능 하지는 않겠지만 배보다 배꼽이 더 큰 처사가 되겠죠~

      그리고 PrintWindow를 사용하더라도 최소화된 상태의 윈도우는 캡쳐가 불가능 하더군요. 그냥 단순히 최소화된 캡션바만 그려지더라구요.

  • Gravatar Image.
    Z | 2006/08/17 02:47 | PERMALINK | EDIT/DEL | REPLY

    모름지기~~~... 이런거~ 블로깅 할 때에눈~~~... PrintWindow API 를 구현해 보았숩니다~... 뭐 이런식이 되면 폼이 좀 나죠~...
    2k 에서 PrintWindow 를 구현해 달라~ 달라~... 폼나눈 블로깅~을 위하야~...흐흐

    • Gravatar Image.
      codewiz | 2006/08/18 22:27 | PERMALINK | EDIT/DEL

      맞는 말씀입니다. ㅎㅎ~ 실력의 부재로 거기까진. 다음에 구현한다면 뽀대나게 공개할께용 *^^*

Name
Password
Homepage
Secret