오래전 WinCE 개발자 카페에 댓글로 달아 놓은것이다.
윈도우 데스크탑 영역을 설명 한것으로 질문은 '작업표시줄을 없앨수 있나....'였다.
윈도우 데스크탑 영역을 설명 한것으로 질문은 '작업표시줄을 없앨수 있나....'였다.
첨에는 그냥 함수 두개만 짜봤는데 점점 길어지네요. -.-;; 아무래도 질문하신 내용에 답을 드리려면 제가 더미쉘을 써봤어야 하는데 써보진 못했습니다. 안써본 사람이 답변한 내용임에 엉뚱한 답변이 될 소지가 있으니 꼭~! 주의 하세요. (엉뚱한 답변에 삽질 이라는거 하실까봐 걱정되서 적습니다.^^;) 제가 이해한 내용이 맞다면 아래에 적은 내용에서 해결점을 찾으실수 있을듯 한데요, 아니라면 쓸데없이 길어서 어쩌죠... ^^ 음... sleep()사용도 위험한 코드고요... while()이나 타이머를 사용해서 HHTaskBar의 핸들을 체크해보세요. 아래는 예제 코드이고요, 컴파일 해보지 않았고 동작 확인을 안해 봤습니다. 나중에 시간되면 정리해보겠지만 우선 급하신대로 참고 해보세요. 하지만 언제나 그렇듯 정리는 안할듯... *^^*; 주의: 컴파일 해보지 않았고, 완성되지 않았고, 검증안된 코드 입니다. 브라우저상에서 직접 적는거라 잘 될수도 안될수도 있습니다. 최대한 주의하거나 수정 할 부분을 넣었지만 이것만 가지고는 부족하니 부디 참고만 하시기 바랍니다. [윈도우 데스크탑 설명 ] 윈도우 데스크탑은 쉘이며 ListView를 가지는 하나의 윈도우 어플리케이션 입니다. 데스크탑의 바탕화면에 보이는 아이콘들은 ListView에 표시된 아이템 들입니다. 데스크탑은 영역이 존재하는데 크게 두부분으로 되어 있습니다. 바탕화면 이라고 불리우는 부분과 태스크바라고 불리우는 영역 입니다. (나름대로 어떤 명칭이 있는데 정확한 명칭은 잊어버렸네요.) 일반적으로 어플리케이션이 동작하는 영역은 바탕화면 이라고 불리우는 영역에서 동작 합니다. 이말은 어플리케이션을 작성해서 실행한후 창을 최대크기로 했을때 바탕화면 영역만큼 커진다는 의미 입니다. 절대로 태스크바 영역을 침범하지 않습니다. 물론 일반적인 경우에 그렇고 일반적이지 않은경우에는 태스크바 영역을 침범 할수 있습니다. 잘아시는 풀스크린 이라는건데요, 이런 풀스크린은 스크린세이버같은거에서 볼수 있습니다. 풀스크린을 만들어 사용하는 방법은 여러가지가 됩니다. DirectX로 만들수가 있고 스크린세이버 방식으로도 할 수 있고 태스크바를 없애고 바탕화면 영역을 키워서 풀스크린을 만들수 있습니다. 그외에도 있겠지만 마지막 방법을 살펴보면 여기서 원하는 몇몇 기술을 습득 할 수 있겠죠. ('태스크바 없애고 바탕화면 영역을 변경하는 방법....'이 되겠죠.) 우선 필요한 함수들을 살펴보면요.. -태스크바. - 태스크바 찾기 - 태스크바 없애기 -바탕화면 영역조절. - 데스크탑 영역 구하기 - 데스크탑 영역 변경하기 이정도가 되겠네요. 다행이도 데스크탑 영역을 구하고 변경하는 함수는 API로 제공이 됩니다.(일거리가 줄었네요. 안만들어도 된다는... ^^) 데스크탑 영역을 구하는 함수는 SystemParametersInfo()입니다. (SystemParametersInfo()함수의 용도는 무척 다양합니다. 윈도우의 여러 환경을 알아 올수 있는함수지요...) 태스크바를 찾는 함수는 FindWindow()로 간단하게 만들수 있습니다. 만들다가 보니 이야기가 잠깐 나왔던... 윈도우가 다 생성되고 활성화 되었는지 언제 아는가??에 대한 해결방법으로 IsWindowEnable()함수를 쓰면 되지 않을까 해서 태스크바 찾는 함수는 두가지로 만들어 봤습니다. 그다지 쓸모는 없는거 같지만요. ^^ [태스크바 찾는 함수] // taskbar가 활성화 되었는지 검사. IsWindowEnable()함수는 컨트롤이 입력을 받을 수 있을때 True를 리턴한다. // 이를 이용해서 HHTaskBar가 생성되고 완전히 활성화 되어 있는 상황인지 검사한다. BOOL IsTaskBar() { return ( IsWindowEnable( FindWindow(L"HHTaskBar", NULL) ) ); } // 또는 BOOL IsTaskBar() { return ( FindWindow(L"HHTaskBar", NULL) ); } // IsTaskBar()함수는 HHTaskBar가 생성 되어 있는지 검사한다. // IsWindowEnable()함수를 사용한것과 사용하지 않은것이 있는데 IsWindowEnable()함수는 컨트롤이 // 입력상태가 완전히 갖춰지면 TRUE를 리턴한다. // 이를 이용해서 HHTaskBar의 완전활성 상태를 검사 하지만 여기서는 그다지 쓸모 있지는 않다. // 컨트롤의 활성화를 체크 하는데 이런 방법도 있다는 차원에서..... [작업영역 변경하는 함수] // TaskBar를 없애고 데스크탑의 영역을 조절한다; void SetWorkArea(void) { RECT rtWork, rtTask; HWND hWndTask; // 윈도 데스크탑의 영역 SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID)&rtWork, 0); // 작업표시줄 핸들과 영역 hWndTask = FindWindow(L"HHTaskBar", NULL); GetWindowRect(hWndTask, &rtTask); // 작업 표시줄 처리 - hWndTask의 핸들을 가지고 태스크바 죽인다. // TerminateProcess()를 사용하여 프로세스를 강제로 죽이는것은 안정성에 문제가 있을수 있기에 // 프로세스를 안전하게 처리하는 함수를 하나 작성해서 사용 하도록 해야 합니다. // 아래에 사용 한것은 그냥 예로써 사용했지만 실무에서 사용하기엔 무리가 있겠죠. // (죽기는 잘 죽을겁니다. 단지 강제로 죽임에 따라 리소스 반환이라던지..여러 문제가 발생 할수도 안할수도 있습니다.) TerminateProcess(hWndTask, 0); // 영역 조절 - Taskbar가 하단에만 있다고 가정하여 하단영역을 늘림. rtWork.bottom = rtTask.bottom; // 윈도 데스크탑의 영역 재설정 한다. SystemParametersInfo(SPI_SETWORKAREA, 0, (LPVOID)&rtWork, SPIF_SENDCHANGE); } 사용예) { .... while( true ) { if (IsTaskBar()) { SetWorkArea(); break; } } .... } 타이머나 while()을 사용해서 태스크바를 검사해야겠죠. 이런방식으로 검사 해야만 합니다. 아니면 쓰레드를 만들어서 검사 하던지요... 끝으로 데스크탑 영역을 변경하는데 있어서 주의사항 몇가지 적습니다. 항상 태스크바를 삭제하면 데스크탑의 영역을 다시 구해서 변경 해줘야 합니다. 물론 태스크바 생성시에도 그래야 겠죠. 그렇지 않을시에는(태스크바만 삭제할 경우) 화면상에 보일때는 화면 전체를 사용 할수 있을거 같아도 실제로는 태스크바 영역은 접근하지 못합니다. 테스트 해보시려면 태스크바를 삭제하는 어플리케이션을 만드신후 태스크바를 없앤후 최대화면으로 해보시면 확인 가능 합니다. 아마 없어진 태스크바 영역을 침범하지 않고 최대화면이 되었을겁니다. 훔... 이를 이용해서 자신만의 태스크바를 만들수도 있습니다. 태스크바를 데스크탑의 위로붙이든, 좌로 붙이든 없앴다가 나타나게 하든, 슬라이드로 보이게 했다가 안보이게 했다가 하든, 태스크바 크기를 늘이거나 줄이거나...... 태스크바를 두개로 하거나 세개로 하거나..등등.. 검증없이 그냥 적어 내려간거라 내용중에 다소 틀린곳이 있더라도 양해 부탁드리며, 혹시나 틀린부분 발견시에는 리플로 기록을 남겨 두도록 하겠습니다; |
'작업일지 > Windows CE' 카테고리의 다른 글
MSCEInf - Windows CE의 CAB파일 관리툴 (0) | 2009.12.04 |
---|---|
WinCE 개발툴 - Remote control (0) | 2009.12.04 |
RETAILMSG의 Ascii출력. (1) | 2009.08.23 |
Windows CE와 Windows Mobile의 차이 그리고 AYGSHELL... (0) | 2009.08.22 |
Windows CE Application에서의 메모리 누수 검사 방법... (0) | 2009.08.22 |