정확하게 작업표시줄의 크기나 위치 변경 메세지는 잘 모르겠습니다만
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 는 같은거죠
글머..
역삼골 님이 쓰신 글 :
: 작업표시줄에 따라 폼의 위치를 변경할려고 하는데요.
: 작업표시줄의 위치나 크기가 바뀌었을때 발생하는 이벤트를 못찾겠네요.
: 도움 부탁드립니다.
: 즐거운 하루 되세요.