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

Ваш аккаунт

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

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

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

Обработка событий без окна

7
01 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Требуется написать программу,которая после запуска выполняет начальные действия,потом висит до завершения сеанса и выполняет заключительные действия.Программа без интерфейса(т.е. ни консоль,ни окно).Каким образом можно сделать,чтобы программа завершилась по выходе из системы?Причём не должно вылезать окно "Программа зависла",после которого будет предложено её завершить вручную

У меня есть 2 варианта:
0)если в системе есть какое-то событие(или другой объект ядра,который можно "подождать":)),которое срабатывает при завершении сеанса,можно в программе написать WaitForSingleObject с дескриптором этого события,и,т.о.,когда начнётся завершение сеанса,ожидание прекратится.Структура программы при этом:
 
Код:
<начальные действия>
<получение дескриптора hKernObj события/семафора/…>
WaitForSingleObject(hKernObj,-1)
<конечные действия>
1)запустить цикл обработки сообщений через GetMessage.Тут у меня вопрос–обязательно ли для GetMessage нужно окно?В MSDN по поводу hWnd написано[QUOTE=MSDN]If NULL,GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread by means of PostThreadMessage[/QUOTE]Отправляется ли сообщение о завершении сеанса(или хотя бы нечто типа WM_Quit/Destroy) таким образом?
В таком случае я бы просто запустил цикл ожидания(без TranslateMessage,и,возможно,без DispatchMessage) и при получении от GetMessage нуля просто завершил бы работу,т.е.:
 
Код:
<начальные действия>
<метка>:
If GetMessage(lMsg,0,0,0)<>0 Then GoTo <метка>
<конечные действия>


Можно ли реализовать это одним из моих способов?И есть ли,помимо них,другие,но только без создания окна?
5
01 марта 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: @pixo $oft
Требуется написать программу,которая после запуска выполняет начальные действия,потом висит до завершения сеанса и выполняет заключительные действия.

Сервис.

7
01 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
М-да,про службы-то я забыл упомянуть…В общем,служба тоже не подходит:её надо регистрировать+при запуске службы создаётся минимум 2 потока,которые OllyDbg отлаживать почему-то не умеет,хотя потоки поддерживает.Фигня какая-то

Есть ещё варианты?Или что-нибудь насчёт моих вариантов?
355
01 марта 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
WM_EndSession
"нет ножек - нет мультиков" (это к вопросу, а нужно ли окно)
7
01 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Благодарю за подсказку кода события.А вот насчёт ножек я что-то не понял…Вернее,совсем не понял:)
355
01 марта 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
насолько я знаю, без окна ты никаких сообщений не получишь
7
01 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Почему же?Посмотри хотя бы цитату из MSDN(в самом начале темы),или просто MSDN прочти на предмет GetMessage

Я тут кое-что пытался написать безоконное,так вот,GetMessage всё-таки заполняет структуру Msg(номер события 0,естественно:))–там время и координаты произошедшего.Координаты те,где была мышь,следовательно,сообщение может быть получено и без окна

…надеюсь быстро завершить тестирование и проверить,сработает ли это с WM_EndSession.Кстати,в чём отличие её от WM_QueryEndSession?
5
01 марта 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: @pixo $oft
Кстати,в чём отличие её от WM_QueryEndSession?

Посылая сообщение WM_QueryEndSession ОС интересуется о принципиальной возможности завершения программы без учистия пользователя. Если хотябы одна программа отвечает 0, то завершение сессии пользователя не выполняется.
После того, как ОС опросила все программы этим сообщением, она посылает WM_ENDSESSION и завершает сессию.

7
02 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Hardcase,благодарю за информирование
А вот в самом начале у меня было 2 гипотезы,так вот,насчёт 0-го варианта–есть такое или это моя фантазия?:)
5
02 марта 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: @pixo $oft
Hardcase,благодарю за информирование
А вот в самом начале у меня было 2 гипотезы,так вот,насчёт 0-го варианта–есть такое или это моя фантазия?:)

Может быть и есть такой объект.
Но я бы особо не парился и создал окно, которое было бы просто скрыто. Какая бы ни была программа, однажды возникнет потребность в окне - да хотя бы настроек :)

7
02 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
В этой программе точно не возникнет:)–никаких там настроек.Это нереально простая программа,поэтому дело за малым…

А если моя программа вызовет Sleep или WaitForSingleObject с бесконечным ожиданием,Windows при завершении сеанса выдаст сообщение о том,что программа не отвечает,или прибьёт её в принудительном порядке?
14
02 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Сначала выдаст. Потом прибъет. Там настройки на такие случаи имеются. Не проще ли проверить чем болтать? :)
7
02 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Вот я и проверил:)

Ничего не выдаёт(лично в моём случае на моей машине;большего мне не надо).Всем большое спасибо за поддержку

P.S.Если вдруг кто знает про такое событие из начала темы,просьба сообщить;)
398
05 марта 2009 года
Alexandoros
630 / / 21.10.2005
Нужно окно. Невидимое. И цикл GetMessage. По мессагам тебе уже ответили.
398
05 марта 2009 года
Alexandoros
630 / / 21.10.2005
ПС Окно и цикл должны быть в найболее раннем созданом потоке, который еще жив на момент шатдауна. Если у тебя однопоточная прога, забей на это сообщение.
7
05 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
В общем,программу уже сделали убедился.Программа однопоточная

Спрашиваю пост-фактум(просто интересно):
Цитата:
hWnd
[in] Handle to the window whose messages are to be retrieved.The window must belong to the current thread.
If hWnd is NULL,GetMessage retrieves messages for any window that belongs to the current thread,and any messages on the current thread's message queue whose hwnd value is NULL(see the MSG structure).Therefore if hWnd is NULL,both window messages and thread messages are processed.
If hWnd is -1,GetMessage retrieves only messages on the current thread's message queue whose hwnd value is NULL,that is,thread messages as posted by PostMessage(when the hWnd parameter is NULL) or PostThreadMessage

Как видите,hWnd может быть нулём.Вот мне и интересно,какие в таком случае сообщения может принять программа без окна(не надо писать,что она примет сообщения,отправленные через PostMessage/PostThreadMessage–это я прекрасно перевёл:))?

87
05 марта 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: @pixo $oft
Вот мне и интересно,какие в таком случае сообщения может принять программа без окна...?


Ну, наверное, может принимать те, которые ты сам задал. Что-то типа:

Код:
#include <windows.h>

const UINT ID_TIMER = 21;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int count = 0;
    MSG msg;
    SetTimer(NULL, ID_TIMER, 1000, NULL);
    while (GetMessage(&msg,NULL,0,0))
    {
        if(msg.message == WM_TIMER)
        {
            Beep(2000, 100);
            count++;
            if (count > 3)
            {
                KillTimer(NULL, ID_TIMER);
                return 0;
            }
        }
    }
    return msg.wParam;
}

Возможно, код не корректный - особо не анализировал. Но работает.
7
05 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Хммм!..Хе-хе:)
Что собственные,это понятно,а вот мне интересно,посылает ли система такие собщения,которые не требуют окна?Например,сообщения от RSM,какие-нибудь оповещения…

P.S.Код выглядит корректным:)
38K
01 апреля 2009 года
alt@zir
29 / / 28.08.2008
Вот тоже без окна:)
http://sources.codenet.ru/download/3071/MicroDM.html
1.9K
09 апреля 2009 года
George22
91 / / 09.12.2007
Можно еще прицепить поток к Експлореру,
тока антивирус будет ругаться. Гы...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог