Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с обработкой сообщений "треем"

318
04 октября 2007 года
nof
193 / / 03.04.2006
Народ, в общем есть MFC приложение, которое я успешно сворачиваю в трэй.
Но вот проблема, не могу обрабатывать сообщения окна, когда оно свёрнуто... Как писалось везде, добавил 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)
После запуска программа совершенно мёртвая - не нажимаются кнопки, не отрисовывается экран...
Подскажите кто-нибудь, что я не так делаю?
3.7K
04 октября 2007 года
_lobster_
115 / / 10.04.2005
Выкладываю недоделаный класс работы с треем. С возникшими вопросами обращайся в личку, либо в асю 214-504-54шесть
318
05 октября 2007 года
nof
193 / / 03.04.2006
Цитата: _lobster_
Выкладываю недоделаный класс работы с треем. С возникшими вопросами обращайся в личку, либо в асю 214-504-54шесть


Дак там же не класс... Там работа с треем на чистом 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 это же почему-то работать не хочет.

3.7K
05 октября 2007 года
_lobster_
115 / / 10.04.2005
Присмотрись внимательнее, это класс(tray.h), в конструкторе которого есть вот такое:
Код:
//перехват основной оконной процедуры
    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;
    }
}

Здесь я указал основные моменты, проанализируй их, может ты что-то упистил.......
534
05 октября 2007 года
HarryAxe
448 / / 19.01.2006
Может, вместо DefWindowProc будешь возвращать
 
Код:
return CDialog::WindowProc(message, wParam, lParam);
?
Или, ещё лучше, вместо WindowProc() перегружай OnWndMsg()
318
12 октября 2007 года
nof
193 / / 03.04.2006
Цитата: HarryAxe

Или, ещё лучше, вместо WindowProc() перегружай OnWndMsg()


Не понял, поясни плз

534
13 октября 2007 года
HarryAxe
448 / / 19.01.2006
Цитата: nof
Не понял, поясни плз


OnWndMsg() вызывается из WindowProc() при обработке сообщений. Назначение CDialog::WindowProc() - рассылать сообщения через message map, в то время, как OnWndMsg() (по идее) служит как раз для того, чтобы обрабатывать сообщения, которые не предусмотрены фреймворком. А так всё аналогично:

Код:
BOOL CMainDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
        switch(message)
        {
            case WM_FROMTRAY:
                if(lParam == WM_LBUTTONDBLCLK)
                {
                    AfxMessageBox("абыр");
                    *pResult = 0;
                }
            break;
        }

        return CDialog::OnWndMsg(message, wParam, lParam, pResult);
    }
318
14 октября 2007 года
nof
193 / / 03.04.2006
Цитата: HarryAxe
OnWndMsg() вызывается из WindowProc() при обработке сообщений. Назначение CDialog::WindowProc() - рассылать сообщения через message map, в то время, как OnWndMsg() (по идее) служит как раз для того, чтобы обрабатывать сообщения, которые не предусмотрены фреймворком. А так всё аналогично:
Код:
BOOL CMainDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
        switch(message)
        {
            case WM_FROMTRAY:
                if(lParam == WM_LBUTTONDBLCLK)
                {
                    AfxMessageBox("абыр");
                    *pResult = 0;
                }
            break;
        }

        return CDialog::OnWndMsg(message, wParam, lParam, pResult);
    }


ыыыы жалко тут спасибы нельзя ставить :D
помогло!!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог