Обработка событий без окна
У меня есть 2 варианта:
0)если в системе есть какое-то событие(или другой объект ядра,который можно "подождать":)),которое срабатывает при завершении сеанса,можно в программе написать WaitForSingleObject с дескриптором этого события,и,т.о.,когда начнётся завершение сеанса,ожидание прекратится.Структура программы при этом:
<получение дескриптора hKernObj события/семафора/…>
WaitForSingleObject(hKernObj,-1)
<конечные действия>
В таком случае я бы просто запустил цикл ожидания(без TranslateMessage,и,возможно,без DispatchMessage) и при получении от GetMessage нуля просто завершил бы работу,т.е.:
<метка>:
If GetMessage(lMsg,0,0,0)<>0 Then GoTo <метка>
<конечные действия>
Можно ли реализовать это одним из моих способов?И есть ли,помимо них,другие,но только без создания окна?
Сервис.
Есть ещё варианты?Или что-нибудь насчёт моих вариантов?
"нет ножек - нет мультиков" (это к вопросу, а нужно ли окно)
Я тут кое-что пытался написать безоконное,так вот,GetMessage всё-таки заполняет структуру Msg(номер события 0,естественно:))–там время и координаты произошедшего.Координаты те,где была мышь,следовательно,сообщение может быть получено и без окна
…надеюсь быстро завершить тестирование и проверить,сработает ли это с WM_EndSession.Кстати,в чём отличие её от WM_QueryEndSession?
Посылая сообщение WM_QueryEndSession ОС интересуется о принципиальной возможности завершения программы без учистия пользователя. Если хотябы одна программа отвечает 0, то завершение сессии пользователя не выполняется.
После того, как ОС опросила все программы этим сообщением, она посылает WM_ENDSESSION и завершает сессию.
А вот в самом начале у меня было 2 гипотезы,так вот,насчёт 0-го варианта–есть такое или это моя фантазия?:)
А вот в самом начале у меня было 2 гипотезы,так вот,насчёт 0-го варианта–есть такое или это моя фантазия?:)
Может быть и есть такой объект.
Но я бы особо не парился и создал окно, которое было бы просто скрыто. Какая бы ни была программа, однажды возникнет потребность в окне - да хотя бы настроек :)
А если моя программа вызовет Sleep или WaitForSingleObject с бесконечным ожиданием,Windows при завершении сеанса выдаст сообщение о том,что программа не отвечает,или прибьёт её в принудительном порядке?
Ничего не выдаёт(лично в моём случае на моей машине;большего мне не надо).Всем большое спасибо за поддержку
P.S.Если вдруг кто знает про такое событие из начала темы,просьба сообщить;)
Спрашиваю пост-фактум(просто интересно):
[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–это я прекрасно перевёл:))?
Ну, наверное, может принимать те, которые ты сам задал. Что-то типа:
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;
}
Возможно, код не корректный - особо не анализировал. Но работает.
Что собственные,это понятно,а вот мне интересно,посылает ли система такие собщения,которые не требуют окна?Например,сообщения от RSM,какие-нибудь оповещения…
P.S.Код выглядит корректным:)
тока антивирус будет ругаться. Гы...