Форум » [x]Harbour » Как поймать событие винды ? » Ответить

Как поймать событие винды ?

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

Ответов - 26, стр: 1 2 All

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

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

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


Dima: Попытался дёрнуть из Минигуи функцию SETGLOBALLISTENER и облом при сборке , ругается на HB_CRITICAL_T s_lst_mtx Подскажет кто как правильно ковырнуть от туда эту функцию ? [pre2] #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 [/pre2]

SergKis: Dima У тебя же не xHb ?! Выкинь лишнее с ним связанное [pre2] #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; } [/pre2]

SergKis: Dima Смотрю gtwwt.c static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) ... сообщения (выше) есть в ней ...[pre2] 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 */ ... [/pre2] т.е. сборка hb с defined( WM_ENDSESSION ) может ловить их, но можно тогда и свое добавить, раз речь осборке

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

SergKis: Dima пишет я понял достаточно в Main процедуре это задефайнить или в модуле gtwwt.c ? Думаю hb надо пересобрать, сделав, например, так[pre2] 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 */ ...[/pre2] Можно цивильнее подойти, подцепив блоки кода 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 на С, т.е.[pre2] 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; [/pre2] но может и не прав с таким подходом

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

Dima: а вот как ловить гибернацию не понятно достаточно будет ловить только PBT_APMSUSPEND или нет ? по идее достаточно [pre2] PBT_APMSUSPEND: ; // переход в спящий режим PBT_APMRESUMESUSPEND: ; // выход из спящего режима, инициированный пользователем (например, нажата клавиша) PBT_APMRESUMEAUTOMATIC: ; // выход из спящего режима [/pre2] Попробовал , не ловит .........

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

SergKis: Dima пишет Когда выполняется hb_vmRequestQuit() , в этом случае выполняется Exit Procedure. Слепил такую , работает однако , проверил С этим ясно, у меня есть vwt программки, как утилитки на разное ..., в них всегда есть INIT и EXIT PROCEDURE со всяким. Я не понял WM_... (выше) поймались или нет ? достаточно будет ловить только PBT_APMSUSPEND или нет ? Power Management Events не ловились события, как и WM_QUERYENDSESSION, WM_ENDSESSION на разных PC где то есть, но в большинстве случаях нету. Потому и закрыл эту лавочку, как писал в самом начале.

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

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

SergKis: Dima пишет Завтра попробую вот такое , ...... case WM_POWERBROADCAST: if ( (wParam = PBT_APMSUSPEND) || (wParam = PBT_APMSTANDBY) || (wParam = PBT_APMQUERYSUSPEND) || (wParam = PBT_APMQUERYSTANDBY)) hb_vmRequestQuit(); return 1; Добавил в пример Андрея [pre2] 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 . [/pre2] т.е. работает на моей 10, думаю, сработает и у клиента. Поправлю либу, версию проги, проверю PS. Засыпание по времени дает [pre2] 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 . [/pre2]

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

SergKis: Dima пишет Не ловится на Win7... Положил программу (поправленную) от Андрея, попробуй у себя на 7-ке. Должна в лог вывести ловит\не ловит. как на Cи после case WM_POWERBROADCAST: сделать запись в файл скажем в корень Дима, надо смотреть тексты hb, может готовое есть. Сам я еще тот С-шник. Потому и предлагал вариант с SetKey(1111111, {|| ... }), чтобы цеплять, что то дополнительное PS hb исходники уже давно не смотрю, т.к. в раб. версии исп. hb от 2018 г., с msvc 2019 исп. hb от 2020 г., остальное это версии hmg и в основном, как тесты. Пробнул только hmg unicode, как утилитку небольшую, полет нормальный. Переводить на нее вряд ли получится. Фирму купили литовцы, так что сижу до конца года в режиме "сопровождения" программ PS2. нашел у себя [pre2] 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) ); } [/pre2]

Dima: SergKis пишет: Положил программу (поправленную) от Андрея, попробуй у себя на 7-ке Да ловит SergKis пишет: PS2. нашел у себя Скрытый текст Из меня сишник ни какой и чего с этим делать не знаю , ладно придумаю что то

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

SergKis: Dima пишет Все понятно...не ловится совсем WM_POWERBROADCAST из gtwwt.c т.е. не входит в case WM_POWERBROADCAST или case 0x0218 или не ловит if ( (wParam == PBT_APMSUSPEND) || (wParam == PBT_APMSTANDBY) || (wParam == PBT_APMQUERYSUSPEND) || (wParam == PBT_APMQUERYSTANDBY)) Выключение и перезагрузку ловит У меня этих сообщений нет, а предыдущие есть. Кинь свой test пробну у себя, что выдаст



полная версия страницы