Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как отловить сообщение минимизации окна? 
:(
    Опции темы
nikitos1980
Дата 8.6.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Банальный вопрос, понимаю, знаю, что поиск рулит (!), но уже полдня не могу отыскать конкретный отет на вопрос: как отловить сообщение сворачивания окна в трей (minimize)

ON_SIZE обработчик WM_SIZE не реагирует на сворачивание (проверял трейсом)
ON_SYSCOMMAND вообще молчит и SC_MINIMIZE не отлавливается.

Так что же использовать?

PM MAIL WWW   Вверх
Cheloveck
Дата 8.6.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



В трей? может на панель просто?

WM_SHOWWINDOW попробуй


--------------------
user posted image
PM Jabber   Вверх
nikitos1980
Дата 8.6.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Поробовал
Не отлавливается сообщение

Код

void CMyView::OnShowWindow(BOOL bShow, UINT nStatus)
{
    TRACE(_T("OnShow %d\n"), bShow);
    CFormView::OnShowWindow(bShow, nStatus);
}

// Нет реакции


А сворачивать действительно хочу на панель виндоус (просто приложение делаю для использования значка в автозапуске)

Добавлено через 8 минут и 43 секунды
Сделал.
Оловил сообщение WM_SYSCOMMAND в окне-рамке.

Код

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
    if (nID == SC_MINIMIZE)
    {
        // TO DO
    }
    CFrameWnd::OnSysCommand(nID, lParam);
}


Это сообщение отредактировал(а) nikitos1980 - 8.6.2009, 19:34
PM MAIL WWW   Вверх
nikitos1980
Дата 19.6.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Пождскажите пожалуйста 2 вопроса:

1. как можно определить параметры командной строки в приложении? Я в автозагрузку (в реестр) пишу путь к своему приложению с параметром -x. Как в приложении определить, было ли оно вызвано с этим параметром или без него (клик по иконке пользователем)?

2. Какое сообщение лучше отлавливать, чтобы при старте приложения его сворачивать и удалять с экрана (скорывать)? Например, WM_CREATE или иное?

Спасибо
PM MAIL WWW   Вверх
Peter
Дата 19.6.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Цитата(nikitos1980 @  19.6.2009,  12:46 Найти цитируемый пост)
1. как можно определить параметры командной строки в приложении?

Приложение с WinMain()? Тогда WinAPI-функция
Код
LPTSTR GetCommandLine(VOID)




Это сообщение отредактировал(а) Peter - 19.6.2009, 14:19


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Cheloveck
Дата 19.6.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Если без WinMain, то

Код

int main(int argc /* количество аргументов*/, char **argv /* массив строк аргументов */ )


Это сообщение отредактировал(а) Cheloveck - 19.6.2009, 15:01


--------------------
user posted image
PM Jabber   Вверх
nikitos1980
Дата 19.6.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Peter, LPWSTR GetCommandLine(VOID) помогло!
Спасибо!


Это сообщение отредактировал(а) nikitos1980 - 19.6.2009, 16:38
PM MAIL WWW   Вверх
Peter
Дата 20.6.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Пожалуйста.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
nikitos1980
Дата 20.6.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Подскажите пожалуйста кто знает
В приложении выполняется новый поток, из которого вызывается функция окна (основного потока). Функция вызывается через указатель, переданный новому потоку в параметре LPVOID. По сути, код выполняется, но появляется ошибка в коде при обращении к основному окну.

Код

CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
if (IsWindow(pFrame->GetSafeHwnd()) && pFrame->IsKindOf(RUNTIME_CLASS(CMainFrame)))
{
    if (IsWindow(pFrame->m_wndSplitter.GetSafeHwnd()))
    {
        CbackupListView* pView = (CbackupListView*)pFrame->m_wndSplitter.GetPane(1, 0);
// Здесь появляется ошибка ASSERT( (p = pMap->LookupPermanent(m_hWnd)) != NULL ||        
//            (p = pMap->LookupTemporary(m_hWnd)) != NULL);
// и ошибка ASSERT((CWnd*)p == this);
        if (IsWindow(pView->GetSafeHwnd()))
        {
            pView->GetListCtrl().InsertItem(pView->GetListCtrl().GetItemCount(), strMessage);
        }
    }
}


По сути в коде функции основного потока получаю указатель к разделяемому окну и пишу сообщение в окно вида, производного от CListView
PM MAIL WWW   Вверх
nikitos1980
Дата 20.6.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Еще один вопрос: никак не могу найти способ, как открыть файл (вернее, получить его размер), который используется другой программой (открыт другим приложением)? Например, я копирую файл с помощью CopyFile() в другую директорию, сначала получаю его размер:

CFile file(strSomeFileName, CFile::modeNoInherit);
// Ошибка CFileException - shareViolation
ULONGLONG dSize = file.GetLEngth(); 

Как открыть такой файл?

Это сообщение отредактировал(а) nikitos1980 - 20.6.2009, 15:47
PM MAIL WWW   Вверх
Peter
Дата 21.6.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Насколько я помню, из потока нельзя закрыть окно, принадлежащее другому потоку. Может быть, и тут та же ошибка? В общем, справку читать надо.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
nikitos1980
Дата 21.6.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Peter, Я и не пытаюсь закрыть окно, я вызываю код в другом потоке...
Цитата

По сути в коде функции основного потока получаю указатель к разделяемому окну и пишу сообщение в окно вида, производного от CListView 

При вызове CbackupListView* pView = (CbackupListView*)pFrame->m_wndSplitter.GetPane(1, 0)
// Именно вызывает ошибку m_wndSplitter.GetPane(1, 0)
появляется ошибка


Это сообщение отредактировал(а) nikitos1980 - 21.6.2009, 12:21
PM MAIL WWW   Вверх
nikitos1980
Дата 21.6.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Цитата
В приложении выполняется новый поток, из которого вызывается функция окна (основного потока). Функция вызывается через указатель, переданный новому потоку в параметре LPVOID. По сути, код выполняется, но появляется ошибка в коде при обращении к основному окну.


Сам отвечу на свой вопрос: при компиляции в режиме Debug появляется ошибка pMap->LookupPermanent(m_hWnd), так как afxMapHWND() возвращает карты [текущего] потока, но в рабочем потоке этих карт нет, т.е. LookupPermanent(m_hWnd) == NULL
В режиме Release эта ошибка не появляется

Поскажите, как можно открыть файл (CFile file(someFileName, CFile::modeOpen)), открытый другим приложением? Например, я хочу узнать размер видео-файла с помощью CFile::GetLength(), в то время как этот файл открыт видео-плеером. Я получаю ошибку shareViolation.
PM MAIL WWW   Вверх
Peter
Дата 22.6.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Цитата(nikitos1980 @  21.6.2009,  12:45 Найти цитируемый пост)
Поскажите, как можно открыть файл (CFile file(someFileName, CFile::modeOpen)), открытый другим приложением?

Я не знаю, что это за режим - CFile::modeOpen, т.к. обхожусь без MFC. В WinAPI есть функция CreateFile (думаю, что класс CFile именно ее и вызывает). У той можно выбрать три варианта доступа к файлу: 0, GENERIC_READ или GENERIC_WRITE. Подозреваю, что при создании объекта CFile достаточно будет сменить режим открытия файла - и тогда можно будет узнать его размер.

Добавлено через 6 минут и 26 секунд
Впрочем, нет. АПИ-функция GetFileLength() требует, чтобы файл был открыт в режиме GENERIC_READ или GENERIC_WRITE.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Earnest
Дата 22.6.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Модератор: Пожалуйста, один топик - один вопрос.
nikitos1980, уже три разных вопроса в этом топике.
Хватит, закрываю тему. Создавай новые топики для разных вопросов.


--------------------
...
PM   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.