장성호님 너무 감사합니다.
매번 도움만 받네요. ^^
2번째 방법으로 코딩하니 잘 동작합니다.
다시한번 감사 드립니다.
즐거운 하루 되세요.
장성호 님이 쓰신 글 :
: 정확하게 작업표시줄의 크기나 위치 변경 메세지는 잘 모르겠습니다만
:
: 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 는 같은거죠
:
: 글머..
:
:
: 역삼골 님이 쓰신 글 :
: : 작업표시줄에 따라 폼의 위치를 변경할려고 하는데요.
: : 작업표시줄의 위치나 크기가 바뀌었을때 발생하는 이벤트를 못찾겠네요.
: : 도움 부탁드립니다.
: : 즐거운 하루 되세요.