On-line: Dr. Oldwarez, PSP, NickSam, гостей 0. Всего: 3 [подробнее..]
АвторСообщение
администратор




Пост N: 7636
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.04.22 17:54. Заголовок: Как поймать событие винды ?


Возможно ли узнать из Harbour момент ухода компа в гибернацию , перезагрузку , выключение компа ?
А то некоторые товарищи не закрывают программу , поэтому иногда портится база......

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]


постоянный участник




Пост N: 4109
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.04.22 19:08. Заголовок: Dima пишет Возможно ..


Dima пишет
 цитата:
Возможно ли узнать из Harbour момент ухода компа в гибернацию , перезагрузку , выключение компа ?


Есть события в windows, но hb их не ловит (обработчика событий внешнего нет, как сейчас не знаю, уже не слежу)
WM_QUERYENDSESSION
WM_ENDSESSION
Можно сделать, на пример hmg программу, для теста, которая будет ловить эти сообщения и по handle твоей проги делать WM_CLOSE, при получении выше указанных сообщений. Тестовая программа нужна для понимания, а выдает ли windows эти сообщения. Столкнулся, что на 10 есть настройка (в google находил как делать, правда давно было) и по умолчанию сообщений не было (у большинства клиентов). Т.к. PC чужие и админ прав нет, то похерил эту тему обработки этих событий. Оставил обработку только в модуле управления LetoDb[f] (запуск как daemon), на всякий случай. Стараюсь max работать открыл таблицу - сделал - закрыл, сохраняя что надо делать в раб. файлах. При запуске работы, если раб. файл есть, то повторяю его на таблицу и удаляю (когда связанные действия с неск. таблицами это важно). Работает такая схема норм, но копии не отменяются, некоторые (важные) делаются в момент получения форм или выборок в спец. каталог без участия пользователя

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7637
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.04.22 19:13. Заголовок: Понял тебя , спасибо..


Понял тебя , спасибо , буду думать

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7245
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.04.22 02:05. Заголовок: Я делал тестовую про..


Я делал тестовую прогу.
Может тебе пригодиться.
https://cloud.mail.ru/public/daHi/tDFsy6oxD

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7638
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.04.22 12:20. Заголовок: Попытался дёрнуть из..


Попытался дёрнуть из Минигуи функцию SETGLOBALLISTENER и облом
при сборке , ругается на HB_CRITICAL_T s_lst_mtx
Подскажет кто как правильно ковырнуть от туда эту функцию ?

 
#pragma BEGINDUMP

#include "Windows.h"
#include <commctrl.h>
#include "hbapiitm.h"
#include "hbvm.h"
#include "hbapi.h"
#include "hbapierr.h"
#include "hbwapi.h"

static HB_CRITICAL_T s_lst_mtx;
#define HMG_LISTENER_LOCK HB_CRITICAL_LOCK( s_lst_mtx );
#define HMG_LISTENER_UNLOCK HB_CRITICAL_UNLOCK( s_lst_mtx );


HB_FUNC( SETGLOBALLISTENER )
{
const char * pszNewName = hb_parc( 1 );

if( pszNewName && hb_dynsymIsFunction( hb_dynsymGet( pszNewName ) ) )
{
HMG_LISTENER_LOCK;
g_ListenerDyns = hb_dynsymGet( pszNewName ); hb_retl( HB_TRUE );
HMG_LISTENER_UNLOCK;
}
else
hb_retl( HB_FALSE );
}

#pragma ENDDUMP



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4110
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.04.22 13:58. Заголовок: Dima У тебя же не x..


Dima
У тебя же не xHb ?!
Выкинь лишнее с ним связанное
 
#ifdef __XHARBOUR__
static HB_CRITICAL_T s_lst_mtx;
#define HMG_LISTENER_LOCK HB_CRITICAL_LOCK( s_lst_mtx );
#define HMG_LISTENER_UNLOCK HB_CRITICAL_UNLOCK( s_lst_mtx );
#else

static HB_CRITICAL_NEW( s_lst_mtx );
#define HMG_LISTENER_LOCK hb_threadEnterCriticalSection( &s_lst_mtx )
#define HMG_LISTENER_UNLOCK hb_threadLeaveCriticalSection( &s_lst_mtx )
#endif /* __XHARBOUR__ */


HB_FUNC( GETGLOBALLISTENER )
{
if( NULL != g_ListenerDyns )
hb_retc( hb_dynsymName( g_ListenerDyns ) );
else
hb_retc_null();
}

HB_FUNC( SETGLOBALLISTENER )
{
const char * pszNewName = hb_parc( 1 );

if( pszNewName && hb_dynsymIsFunction( hb_dynsymGet( pszNewName ) ) )
{
HMG_LISTENER_LOCK;
g_ListenerDyns = hb_dynsymGet( pszNewName ); hb_retl( HB_TRUE );
HMG_LISTENER_UNLOCK;
}
else
hb_retl( HB_FALSE );
}

HB_FUNC( RESETGLOBALLISTENER )
{
HMG_LISTENER_LOCK;
g_ListenerDyns = hb_dynsymGet( DEFAULT_LISTENER );
HMG_LISTENER_UNLOCK;
}

static size_t AppEventScan( EVENTSHOLDER * events, UINT message )
{
size_t i, nPos = 0;

for( i = 0; i < events->count; i++ )
{
if( message == events->events[ i ].message )
{
nPos = ( i + 1 ); break;
}
}

return nPos;
}


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4111
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.04.22 15:07. Заголовок: Dima Смотрю gtwwt.c..


Dima
Смотрю gtwwt.c
static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
...
сообщения (выше) есть в ней
...
 
case WM_QUERYENDSESSION: /* check if we can shutdown or logoff */
return 1;

#if defined( WM_ENDSESSION )
case WM_ENDSESSION: /* shutdown started */
if( wParam )
hb_vmRequestQuit();
return 0;
#endif

case WM_CLOSE: /* Clicked 'X' on system menu */
...

т.е. сборка hb с defined( WM_ENDSESSION ) может ловить их, но можно тогда и свое добавить, раз речь осборке

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7639
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.04.22 15:38. Заголовок: супер , попробую :s..


супер , попробую

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4112
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.04.22 16:12. Заголовок: Dima пишет я понял д..


Dima пишет
 цитата:
я понял достаточно в Main процедуре это задефайнить или в модуле gtwwt.c ?


Думаю hb надо пересобрать, сделав, например, так
 
static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
...
case WM_QUERYENDSESSION: /* check if we can shutdown or logoff */
hb_vmRequestQuit();
return 1;

case WM_ENDSESSION: /* shutdown started */
hb_vmRequestQuit();
return 1;

case WM_CLOSE: /* Clicked 'X' on system menu */
...

Можно цивильнее подойти, подцепив блоки кода
SetKey(1111111, {|| Nil \ hb_vmRequestQuit() }) // case WM_QUERYENDSESSION: /* check if we can shutdown or logoff */
SetKey(1111112, {|| Nil \ hb_vmRequestQuit() }) // case WM_ENDSESSION: /* shutdown started */
добавив в процедуру на case ... типа нажатия клавиши _PushKey(...), но не помню уже как это делать в wwt на С, т.е.
 
case WM_QUERYENDSESSION: /* check if we can shutdown or logoff */
_PushKey(...) // hb_vmRequestQuit();
return 1;

case WM_ENDSESSION: /* shutdown started */
_PushKey(...) // hb_vmRequestQuit();
return 1;

но может и не прав с таким подходом

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7640
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.04.22 18:36. Заголовок: Сергей всё оказалось..


Сергей всё оказалось проще :)
Когда выполняется hb_vmRequestQuit() , в этом случае выполняется Exit Procedure.
Слепил такую , работает однако , проверил
 
EXIT PROCEDURE MyExit()
dbcloseall()
ferase(hb_CurDrive()+":\"+CurDir()+"\"+'boots.dat')
RETURN


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7641
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.04.22 18:49. Заголовок: а вот как ловить гиб..


а вот как ловить гибернацию не понятно
достаточно будет ловить только PBT_APMSUSPEND или нет ?

по идее достаточно
 
PBT_APMSUSPEND: ; // переход в спящий режим
PBT_APMRESUMESUSPEND: ; // выход из спящего режима, инициированный пользователем (например, нажата клавиша)
PBT_APMRESUMEAUTOMATIC: ; // выход из спящего режима


Попробовал , не ловит .........

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7642
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.04.22 19:37. Заголовок: Пробнул такой строко..


Пробнул такой строкой решить не поймало ....
 
case WM_POWERBROADCAST:
if( wParam == PBT_APMSUSPEND )
hb_vmRequestQuit();
return 1;


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4113
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.04.22 20:31. Заголовок: Dima пишет Когда вып..


Dima пишет
 цитата:
Когда выполняется hb_vmRequestQuit() , в этом случае выполняется Exit Procedure.
Слепил такую , работает однако , проверил


С этим ясно, у меня есть vwt программки, как утилитки на разное ..., в них всегда есть INIT и EXIT PROCEDURE со всяким.
Я не понял WM_... (выше) поймались или нет ?

 цитата:
достаточно будет ловить только PBT_APMSUSPEND или нет ?


Power Management Events не ловились события, как и WM_QUERYENDSESSION, WM_ENDSESSION на разных PC где то есть, но в большинстве случаях нету. Потому и закрыл эту лавочку, как писал в самом начале.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7643
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.04.22 20:48. Заголовок: SergKis пишет: WM_Q..


SergKis пишет:

 цитата:
WM_QUERYENDSESSION, WM_ENDSESSION


у меня в WIN7 поймалось нормально
Завтра попробую вот такое , если "смерч" или "ураган" не прилетит в дом , ну ты в курсе что у нас война......
 
case WM_POWERBROADCAST:
if ( (wParam = PBT_APMSUSPEND) || (wParam = PBT_APMSTANDBY) || (wParam = PBT_APMQUERYSUSPEND) || (wParam = PBT_APMQUERYSTANDBY))
hb_vmRequestQuit();
return 1;



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4114
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.04.22 21:02. Заголовок: Dima пишет у меня в ..


Dima пишет
 цитата:
у меня в WIN7 поймалось нормально


В win 7,8 было OK!
А в 10 случился казус, на раб. местах, клиентских с Leto, перестало ловится (disconnect не случается), вставил log, так их нет, этих сообщений. Пришлось костыли городить.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4115
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.04.22 07:57. Заголовок: Dima пишет Завтра по..


Dima пишет
 цитата:
Завтра попробую вот такое , ......

case WM_POWERBROADCAST:
if ( (wParam = PBT_APMSUSPEND) || (wParam = PBT_APMSTANDBY) || (wParam = PBT_APMQUERYSUSPEND) || (wParam = PBT_APMQUERYSTANDBY))
hb_vmRequestQuit();
return 1;


Добавил в пример Андрея
 
FUNCTION App_OnEvents( hHwnd, nMsg, wParam, lParam )
...
ELSEIF nMsg == WM_DESTROY // 2
? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_DESTROY", ProcNL() ; ? "."
RETURN 1

ELSEIF nMsg == WM_POWERBROADCAST
? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_POWERBROADCAST", ProcNL(), wParam
? "PBT_APMQUERYSUSPEND =", wParam == PBT_APMQUERYSUSPEND
? "PBT_APMQUERYSTANDBY =", wParam == PBT_APMQUERYSTANDBY
? "PBT_APMSUSPEND =", wParam == PBT_APMSUSPEND
? "PBT_APMSTANDBY =", wParam == PBT_APMSTANDBY
?
RETURN 1

ENDIF

RETURN Events( hHwnd, nMsg, wParam, lParam)

Получил у себя выкл.\вкл. по кнопке и закрыл\открыл экран ноута

2022-04-14 07:43:11.715 Launching the program Call from: MAIN(55) --> demo.prg
2022-04-14 07:44:34.269 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 4
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .T.

PBT_APMSTANDBY = .F.

2022-04-14 07:44:59.371 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 18
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .F.
PBT_APMSTANDBY = .F.

2022-04-14 07:44:59.948 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 7
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .F.
PBT_APMSTANDBY = .F.

2022-04-14 07:45:49.100 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 4
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .T.

PBT_APMSTANDBY = .F.

2022-04-14 07:46:58.395 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 18
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .F.
PBT_APMSTANDBY = .F.

2022-04-14 07:46:59.148 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 7
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .F.
PBT_APMSTANDBY = .F.

2022-04-14 07:47:49.460 Closing the program Call from: MYEXITPRG(103) --> demo.prg
.

т.е. работает на моей 10, думаю, сработает и у клиента. Поправлю либу, версию проги, проверю

PS. Засыпание по времени дает
 
2022-04-14 08:31:46.579 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 4
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .T.

PBT_APMSTANDBY = .F.

2022-04-14 08:36:42.972 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 7
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .F.
PBT_APMSTANDBY = .F.

2022-04-14 08:36:42.972 Event arrived - WM_POWERBROADCAST Call from: APP_ONEVENTS(164) --> demo.prg 18
PBT_APMQUERYSUSPEND = .F.
PBT_APMQUERYSTANDBY = .F.
PBT_APMSUSPEND = .F.
PBT_APMSTANDBY = .F.

2022-04-14 08:36:58.464 Closing the program Call from: MYEXITPRG(103) --> demo.prg
.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7644
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.04.22 09:18. Заголовок: SergKis пишет: Dima..


SergKis пишет:

 цитата:
Dima пишет
цитата:
Завтра попробую вот такое , ......

case WM_POWERBROADCAST:
if ( (wParam = PBT_APMSUSPEND) || (wParam = PBT_APMSTANDBY) || (wParam = PBT_APMQUERYSUSPEND) || (wParam = PBT_APMQUERYSTANDBY))
hb_vmRequestQuit();
return 1;



Не ловится на Win7...
Сергей а как на Cи после case WM_POWERBROADCAST: сделать запись в файл скажем в корень
диска C: и туда пихнуть wParam ?
Ну что бы понимать ловится вообще WM_POWERBROADCAST или нет а если ловится что приплыло в wParam

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4116
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.04.22 09:39. Заголовок: Dima пишет Не ловитс..


Dima пишет
 цитата:
Не ловится на Win7...


Положил программу (поправленную) от Андрея, попробуй у себя на 7-ке. Должна в лог вывести ловит\не ловит.

 цитата:
как на Cи после case WM_POWERBROADCAST: сделать запись в файл скажем в корень


Дима, надо смотреть тексты hb, может готовое есть. Сам я еще тот С-шник.
Потому и предлагал вариант с SetKey(1111111, {|| ... }), чтобы цеплять, что то дополнительное
PS
hb исходники уже давно не смотрю, т.к. в раб. версии исп. hb от 2018 г., с msvc 2019 исп. hb от 2020 г., остальное это версии hmg и в основном, как тесты. Пробнул только hmg unicode, как утилитку небольшую, полет нормальный. Переводить на нее вряд ли получится. Фирму купили литовцы, так что сижу до конца года в режиме "сопровождения" программ

PS2. нашел у себя Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7645
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.04.22 10:09. Заголовок: SergKis пишет: Поло..


SergKis пишет:

 цитата:
Положил программу (поправленную) от Андрея, попробуй у себя на 7-ке


Да ловит
SergKis пишет:

 цитата:
PS2. нашел у себя Скрытый текст


Из меня сишник ни какой и чего с этим делать не знаю , ладно придумаю что то

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7646
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.04.22 12:45. Заголовок: Все понятно...не лов..


Все понятно...не ловится совсем WM_POWERBROADCAST из gtwwt.c
Выключение и перезагрузку ловит.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4117
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.04.22 13:37. Заголовок: Dima пишет Все понят..


Dima пишет
 цитата:
Все понятно...не ловится совсем WM_POWERBROADCAST из gtwwt.c


т.е. не входит в case WM_POWERBROADCAST или case 0x0218
или не ловит
if ( (wParam == PBT_APMSUSPEND) || (wParam == PBT_APMSTANDBY) || (wParam == PBT_APMQUERYSUSPEND) || (wParam == PBT_APMQUERYSTANDBY))

 цитата:
Выключение и перезагрузку ловит


У меня этих сообщений нет, а предыдущие есть.
Кинь свой test пробну у себя, что выдаст

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 90
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет