Автор | Сообщение |
|
| |
Пост N: 7636
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.04.22 17:54. Заголовок: Как поймать событие винды ?
Возможно ли узнать из Harbour момент ухода компа в гибернацию , перезагрузку , выключение компа ? А то некоторые товарищи не закрывают программу , поэтому иногда портится база......
|
|
|
Ответов - 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 работать открыл таблицу - сделал - закрыл, сохраняя что надо делать в раб. файлах. При запуске работы, если раб. файл есть, то повторяю его на таблицу и удаляю (когда связанные действия с неск. таблицами это важно). Работает такая схема норм, но копии не отменяются, некоторые (важные) делаются в момент получения форм или выборок в спец. каталог без участия пользователя
|
|
|
|
| |
Пост N: 7637
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.04.22 19:13. Заголовок: Понял тебя , спасибо..
Понял тебя , спасибо , буду думать
|
|
|
|
| постоянный участник
|
Пост N: 7245
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.04.22 02:05. Заголовок: Я делал тестовую про..
|
|
|
|
| |
Пост 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
|
|
|
|
| постоянный участник
|
Пост 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; }
|
|
|
|
| постоянный участник
|
Пост 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 ) может ловить их, но можно тогда и свое добавить, раз речь осборке
|
|
|
|
| |
Пост N: 7639
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.04.22 15:38. Заголовок: супер , попробую :s..
супер , попробую
|
|
|
|
| постоянный участник
|
Пост 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; но может и не прав с таким подходом
|
|
|
|
| |
Пост 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
|
|
|
|
| |
Пост N: 7641
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.04.22 18:49. Заголовок: а вот как ловить гиб..
а вот как ловить гибернацию не понятно достаточно будет ловить только PBT_APMSUSPEND или нет ? по идее достаточно PBT_APMSUSPEND: ; // переход в спящий режим PBT_APMRESUMESUSPEND: ; // выход из спящего режима, инициированный пользователем (например, нажата клавиша) PBT_APMRESUMEAUTOMATIC: ; // выход из спящего режима Попробовал , не ловит .........
|
|
|
|
| |
Пост N: 7642
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.04.22 19:37. Заголовок: Пробнул такой строко..
Пробнул такой строкой решить не поймало .... case WM_POWERBROADCAST: if( wParam == PBT_APMSUSPEND ) hb_vmRequestQuit(); return 1;
|
|
|
|
|
| постоянный участник
|
Пост 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 где то есть, но в большинстве случаях нету. Потому и закрыл эту лавочку, как писал в самом начале.
|
|
|
|
| |
Пост 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;
|
|
|
|
| постоянный участник
|
Пост N: 4114
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.04.22 21:02. Заголовок: Dima пишет у меня в ..
Dima пишет цитата: | у меня в WIN7 поймалось нормально |
| В win 7,8 было OK! А в 10 случился казус, на раб. местах, клиентских с Leto, перестало ловится (disconnect не случается), вставил log, так их нет, этих сообщений. Пришлось костыли городить.
|
|
|
|
| постоянный участник
|
Пост 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 .
|
|
|
|
| |
Пост 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
|
|
|
|
| постоянный участник
|
Пост N: 4116
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.04.22 09:39. Заголовок: Dima пишет Не ловитс..
Dima пишет Положил программу (поправленную) от Андрея, попробуй у себя на 7-ке. Должна в лог вывести ловит\не ловит. цитата: | как на Cи после case WM_POWERBROADCAST: сделать запись в файл скажем в корень |
| Дима, надо смотреть тексты hb, может готовое есть. Сам я еще тот С-шник. Потому и предлагал вариант с SetKey(1111111, {|| ... }), чтобы цеплять, что то дополнительное PS hb исходники уже давно не смотрю, т.к. в раб. версии исп. hb от 2018 г., с msvc 2019 исп. hb от 2020 г., остальное это версии hmg и в основном, как тесты. Пробнул только hmg unicode, как утилитку небольшую, полет нормальный. Переводить на нее вряд ли получится. Фирму купили литовцы, так что сижу до конца года в режиме "сопровождения" программ PS2. нашел у себя Скрытый текст
void _MemoWrit_( byte *cFile, void *Txt, ULONG Len){ HB_FHANDLE fhnd = hb_fsCreate( cFile, FC_NORMAL ); if( fhnd != FS_ERROR ){ hb_fsWriteLarge( fhnd, Txt, Len); hb_fsClose( fhnd ); } } void _MemoWrit( byte *cFile, byte *Txt){ _MemoWrit_( cFile, Txt, strlen(Txt) ); }
|
|
|
|
|
| |
Пост N: 7645
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.04.22 10:09. Заголовок: SergKis пишет: Поло..
SergKis пишет: цитата: | Положил программу (поправленную) от Андрея, попробуй у себя на 7-ке |
| Да ловит SergKis пишет: цитата: | PS2. нашел у себя Скрытый текст |
| Из меня сишник ни какой и чего с этим делать не знаю , ладно придумаю что то
|
|
|
|
| |
Пост N: 7646
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.04.22 12:45. Заголовок: Все понятно...не лов..
Все понятно...не ловится совсем WM_POWERBROADCAST из gtwwt.c Выключение и перезагрузку ловит.
|
|
|
|
| постоянный участник
|
Пост 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 пробну у себя, что выдаст
|
|
|
|
| |
Пост N: 7647
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.04.22 14:52. Заголовок: SergKis пишет: if (..
SergKis пишет: цитата: | if ( (wParam == PBT_APMSUSPEND) || (wParam == PBT_APMSTANDBY) || (wParam == PBT_APMQUERYSUSPEND) || (wParam == PBT_APMQUERYSTANDBY)) |
| Это я отключил пока SergKis пишет: цитата: | т.е. не входит в case WM_POWERBROADCAST |
| да не входит SergKis пишет: цитата: | Кинь свой test пробну у себя, что выдаст |
| Теста нет , на живой проге тестю .......правленный gtwwt.c я иак понял тебя не устроит так же как и либа gtwvt под Mingw PS Думаю гибернация или сон не смертелен для локальной проги и открытых баз , так что бог с ним , пусть гибернируют ))
|
|
|
|
|
| |
Пост N: 327
Зарегистрирован: 05.10.06
|
|
Отправлено: 14.04.22 19:48. Заголовок: Dima пишет: так что..
Dima пишет: цитата: | так что бог с ним , пусть гибернируют )) |
| сделай таймер по активности пользователя, если бездействует то завершай прогу
|
|
|
|
| |
Пост N: 7648
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.04.22 19:53. Заголовок: MIKHAIL пишет: сдел..
MIKHAIL пишет: цитата: | сделай таймер по активности пользователя, если бездействует то завершай прогу |
| давно уже сделан. 1 час неактивности и выброс из проги.
|
|
|
|
| |
Пост N: 328
Зарегистрирован: 05.10.06
|
|
Отправлено: 14.04.22 21:27. Заголовок: Dima попробуй в план..
Dima попробуй в планировщике создать задание по записи события в журнале системы по коду события
|
|
|
|
| постоянный участник
|
Пост N: 7491
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.07.23 16:49. Заголовок: Сетка из 2-х компов...
Сетка из 2-х компов. Сервер Win11 , локальный комп Win10. Прога МиниГуи на Win10 иногда зависает, экран белым становиться и вот такое окно появляется. А можно как то отловить это событие ?
|
|
|
|
| moderator
|
Пост N: 2176
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.07.23 17:04. Заголовок: Andrey пишет: отлов..
Andrey пишет: Уже обсуждалось здесь
|
|
|
Ответов - 26
, стр:
1
2
All
[только новые]
|
|