C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[53808] Re:작업표시줄의 크기,위치가 변경되었을때 이벤트를 받고 싶습니다.
장성호 [nasilso] 2201 읽음    2008-06-30 14:39
정확하게 작업표시줄의 크기나 위치 변경  메세지는 잘 모르겠습니다만

Hook을 이용한 방법을 제외하고
작업표시줄의 크기나 위치 변경을 확인하는 방법을 한 2가지가 소개해 봅니다.


방법1.    WM_GETMINMAXINFO 메세지를 이용

   WM_GETMINMAXINFO 메세지는 Window 크기나 위치가 조정될때 언제나 발생합니다.
   즉 TasbBar(작업표시줄)이 움직이지 않아도 Form의 크기만 조절해도 발생하죠

   그런데
   작업 표시줄이 움직이면 데스크탑의 모든 윈도우의 크기나 위치를 조절하는데
   이때 항상 WM_GETMINMAXINFO 메세지가 발생합니다.

   WM_GETMINMAXINFO 메세지가 발생했을때
   데스트탑의 WorkArea를 확인해 보면 될것 같습니다.

void __fastcall TForm1::WndProc(TMessage &Msg)
{
  if(Msg.Msg==WM_GETMINMAXINFO)
  {
    Memo1->Lines->Clear();
   
   //WorkArea확인 방법 1
    s.printf("WorkAreaRect Left=%d , Toop=%d , Width=%d, Height=%d",Screen->WorkAreaLeft,Screen->WorkAreaTop,Screen->WorkAreaWidth,Screen->WorkAreaHeight);
    Memo1->Lines->Add(s);

   //WorkArea확인 방법 2
    TRect rc;
    SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);
    s.printf("SPI_GETWORKAREA Left=%d , Toop=%d , Width=%d, Height=%d",rc.left,rc.top,rc.right,rc.bottom);
    Memo1->Lines->Add(s);


  }
  TForm::WndProc(Msg);
}



방법2.  SHAppBarMessage 이용
    작업표시줄 Tray에 Icon을 등록하고 마우스 이벤트를 받을때  Shell_NotifyIcon 함수를 이용하는데
    이때 NOTIFYICONDATA 구조체의  uCallbackMessage를 설정해서 메세지를 받습니다.
    http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=89

    같은 방식으로 TaskBar에서 일어나는 이벤트를
    APPBARDATA 구조체의 uCallbackMessage를 통해서 받을수 있습니다.
   http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=35447
   http://69.10.233.10/KB/shell/csdoesshell3.aspx?display=PrintAll


 unsigned int iAppMsg_id;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  APPBARDATA Abd;
  Abd.cbSize=sizeof(APPBARDATA);
  Abd.hWnd=Handle;
  iAppMsg_id=WM_APP+1;
  Abd.uCallbackMessage = WM_APP+1;
  SHAppBarMessage(ABM_NEW,&Abd);

}
void __fastcall TForm1::WndProc(TMessage &Msg)
{
  if(Msg.Msg==iAppMsg_id)
  {
    if(Msg.WParam==1)
    {
        Memo2->Lines->Add("Resize TaskBar");
        TRect rc;
        String s;
        SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);
        s.printf("SPI_GETWORKAREA Left=%d , Toop=%d , Width=%d, Height=%d",rc.left,rc.top,rc.right,rc.bottom);
        Memo1->Lines->Add(s);
    }
   }
   TForm::WndProc(Msg);
  }


     
음...
Screen->WorkArea는
SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0); 를 통해서 확인합니다.
결국 방법1,2 는 같은거죠

글머..


역삼골 님이 쓰신 글 :
: 작업표시줄에 따라 폼의 위치를 변경할려고 하는데요.
: 작업표시줄의 위치나 크기가 바뀌었을때 발생하는 이벤트를 못찾겠네요.
: 도움 부탁드립니다.
: 즐거운 하루 되세요.

+ -

관련 글 리스트
53807 작업표시줄의 크기,위치가 변경되었을때 이벤트를 받고 싶습니다. 역삼골 1577 2008/06/30
53808     Re:작업표시줄의 크기,위치가 변경되었을때 이벤트를 받고 싶습니다. 장성호 2201 2008/06/30
53809         Re:Re:작업표시줄의 크기,위치가 변경되었을때 이벤트를 받고 싶습니다. 역삼골 1839 2008/06/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.