TTrayIcon의 ShowBalloonHint()를 이용하면 트레이에 풍선힌트는 나오지만 그 풍선을 클릭했을때 이벤트를 받는 방법이 없습니다.
그래서 윈도우 훅을 통해 메세지를 받아보니 잘 됩니다. 소스를 올립니다.
H 파일에 메세지 핸들러 하나 만드시구요
void OnBalloonClick(TMessage& msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_USER+1, TMessage,OnBalloonClick)
END_MESSAGE_MAP(TForm);
Cpp 파일에는 다음과 같이 하세요.
(Form1은 상황에 따라서 적당히 이름 지어 주시구요)
HHOOK hHook;
LRESULT CALLBACK CallWndProc1(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* msg = (CWPSTRUCT*)lParam;
if(nCode >=0 && msg->message == WM_USER+1 && msg->lParam==1029)
Form1->Perform(WM_USER+1,msg->lParam,msg->wParam);
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
{
hHook = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC)CallWndProc1, 0, GetCurrentThreadId());
}
설명을 드리자면 이렇습니다.
폼 생성자에서 윈도우 훅을 설치합니다.(SetWindowsHookEx)
프로그램에서 필요할때 ShowBalloonHint()를 호출하여 풍선이 뜰것이고 사용자가 풍선을 클릭하면
Spy++로 확인해본바 TPUtilWindow라는 숨겨져있는 윈도우에 WM_USER+1 메세지가 갑니다.
그 메세지를 CallWndProc1에서 확인하여 맞으면 Form1에 WM_USER+1을 보내줍니다.
(제가 확인해보니 lParam이 1029가 클릭입니다.)
이상입니다. 너무 간단해서 별달리 말씀드릴게 없네요..
그런데 왜 볼랜드에서 TTrayIcon 콤포넌트에 풍선 클릭 이벤트를 만들어 놓지 않았는지 정말 의문입니다.
|