Проблема с обработкой сообщений "треем"
Но вот проблема, не могу обрабатывать сообщения окна, когда оно свёрнуто... Как писалось везде, добавил virtual-функцию:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CMainDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message) {
case WM_FROMTRAY:
if(lParam == WM_LBUTTONDBLCLK)
AfxMessageBox("абыр");
break;
}
return DefWindowProc(message, wParam, lParam);
}
Где WM_FROMTRAY:
#define WM_FROMTRAY (WM_APP + 1)
После запуска программа совершенно мёртвая - не нажимаются кнопки, не отрисовывается экран...
Подскажите кто-нибудь, что я не так делаю?
Дак там же не класс... Там работа с треем на чистом WinAPI. Это понятно, я же такой же обработчик юзаю. У тебя:
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
char MessString[256];
switch (iMsg) {
.............
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
И у меня см. выше... Под MFC это же почему-то работать не хочет.
OldWindowProc = (WNDPROC)SetWindowLong(_hWnd,GWL_WNDPROC, (long)ClassWndProc);
IconData = new NOTIFYICONDATAA;
IconData->cbSize = sizeof(NOTIFYICONDATAA);
IconData->hWnd = _hWnd;
IconData->uID = 0;
IconData->uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
// ЗДЕСЬ КОД СООБЩЕНИЯ (#define WM_TRAYMESSAGE WM_USER+1)
IconData->uCallbackMessage = WM_TRAYMESSAGE;
IconData->hIcon = _hIcon;
.............................................
.............................................
LRESULT CALLBACK ClassWndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
if (iMsg==WM_TRAYMESSAGE)
{
if (OnEventTrayA)
OnEventTrayA(lParam);//обработчик в main.cpp
}
return OldWindowProc(hwnd, iMsg, wParam, lParam);//вызов настоящей WndProc
}
....................................................
....................................................
//обработчик
void OnEventTray(DWORD msg)
{
switch(msg)
{
case WM_LBUTTONDOWN:
...........................
break;
case WM_RBUTTONDOWN:
...........................
break;
}
}
Здесь я указал основные моменты, проанализируй их, может ты что-то упистил.......
Или, ещё лучше, вместо WindowProc() перегружай OnWndMsg()
Или, ещё лучше, вместо WindowProc() перегружай OnWndMsg()
Не понял, поясни плз
OnWndMsg() вызывается из WindowProc() при обработке сообщений. Назначение CDialog::WindowProc() - рассылать сообщения через message map, в то время, как OnWndMsg() (по идее) служит как раз для того, чтобы обрабатывать сообщения, которые не предусмотрены фреймворком. А так всё аналогично:
{
switch(message)
{
case WM_FROMTRAY:
if(lParam == WM_LBUTTONDBLCLK)
{
AfxMessageBox("абыр");
*pResult = 0;
}
break;
}
return CDialog::OnWndMsg(message, wParam, lParam, pResult);
}
{
switch(message)
{
case WM_FROMTRAY:
if(lParam == WM_LBUTTONDBLCLK)
{
AfxMessageBox("абыр");
*pResult = 0;
}
break;
}
return CDialog::OnWndMsg(message, wParam, lParam, pResult);
}
ыыыы жалко тут спасибы нельзя ставить :D
помогло!!!