Форум » [x]Harbour » Как запретить закрытие терминального окна "крестом"? » Ответить

Как запретить закрытие терминального окна "крестом"?

PSP: Речь идет об терминальном окне с прогой на xHarbour. Извините за ламерский вопрос. Возможно ли это? Если да, то как? Спасибо.

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

Dima: Где то была похожая тема , поищи !

PSP: Не нашёл я ни хрена, чё-та... Сорри...

gfilatov: // How to disable Close for console Window Function Main() Local hWnd SetConsoleTitle( "This is my console Title" ) hWnd:= FindWindow( "This is my console Title" ) CLS ? " The close button is Enable " inkey( 0 ) DeleteCloseButton( hWnd) ? " The close button is Disable" inkey(0) Alert("Closing") #PRAGMA BEGINDUMP #include "hbapi.h" #include "Windows.h" HB_FUNC( SETCONSOLETITLE ) { hb_retl( SetConsoleTitle( hb_parc( 1 ) ) ) ; } HB_FUNC( FINDWINDOW ) { hb_retnl( (LONG)FindWindow( NULL, hb_parc( 1 ) ) ) ; } HB_FUNC( DELETECLOSEBUTTON ) { DeleteMenu(GetSystemMenu( (HWND)hb_parnl( 1 ), FALSE), SC_CLOSE, MF_BYCOMMAND ) ; DrawMenuBar( (HWND)hb_parnl( 1 ) ); } #PRAGMA ENDDUMP


PSP: Спасибо огромное!

PSP: Пришлось добавить такой цикл: WHILE ( hWnd:= FindWindow( "Window Title" ) ) == 0 END // WHILE Почему-то иногда hWnd оказывается == 0 и, естественно DeleteCloseButton( hWnd ) ничего не делает. И еще: русские имена окон не прокатывают. Спасибо еще раз!

Dima: Может пригодится кому DeleteCloseButton(GetConsoleWindow()) ЗЫ Mingw [pre2] #PRAGMA BEGINDUMP #include "hbapi.h" #include "Windows.h" HB_FUNC( DELETECLOSEBUTTON ) { DeleteMenu(GetSystemMenu( (HWND)hb_parnl( 1 ), FALSE), SC_CLOSE, MF_BYCOMMAND ) ; DrawMenuBar( (HWND)hb_parnl( 1 ) ); } WINBASEAPI HWND APIENTRY GetConsoleWindow( VOID ); HB_FUNC( GETCONSOLEWINDOW ) { hb_retnl( (LONG)GetConsoleWindow( ) ) ; } #PRAGMA ENDDUMP [/pre2]

AndreyZh: Мне отвечали по данному вопросу... 1. Для терминала WIN [pre2] SetConsoleTitle(Alltrim(cTxt)) hW := FindWindow(Alltrim(cTxt)) DeleteCloseButton(hW) #PRAGMA BEGINDUMP #include "hbapi.h" #include "windows.h" HB_FUNC(SETCONSOLETITLE) { hb_retl( SetConsoleTitle( hb_parc(1) ) ); } HB_FUNC(FINDWINDOW) { hb_retnl( (LONG) FindWindow(NULL,hb_parc(1)) ); } HB_FUNC(DELETECLOSEBUTTON) { DeleteMenu( GetSystemMenu((HWND) hb_parnl(1), FALSE), SC_CLOSE, MF_BYCOMMAND ) ; DrawMenuBar( (HWND) hb_parnl(1) ) ; } #PRAGMA ENDDUMP [/pre2] Для WVT [pre2] ANNOUNCE HB_GTSYS REQUEST HB_GT_WVT REQUEST HB_GT_WVT_DEFAULT HB_gtInfo( HB_GTI_CLOSABLE, .F. ) // Блокирую крестик [/pre2]

Pasha: AndreyZh пишет: HB_gtInfo( HB_GTI_CLOSABLE, .F. ) Я смотрю, в Harbour gtwin тоже реализована эта функция. Так что велосипед можно не изобретать. 2010-03-05 11:11 UTC+0100 Viktor Szakats (harbour syenar.net) ... * src/rtl/gtwin/gtwin.c % Simplified the way close button status is retrieved (based on code posted Saulius Zrelskis) + Added code to disable 'close' menu also. This is using undocumented Windows API call, so by default the logic is disabled, and can be enabled with HB_GTWIN_USE_UNDOC_WINAPI macro. (Thanks to Saulius Zrelskis for this API tip) (NOTE: All 'close' controls are controlled by HB_GTI_CLOSABLE) т.е. чтобы открыть эту функцию, надо собрать харбор с макросом HB_GTWIN_USE_UNDOC_WINAPI

Dima: Pasha пишет: т.е. чтобы открыть эту функцию, надо собрать харбор с макросом HB_GTWIN_USE_UNDOC_WINAPI а без пересборки ни как ? ;) пересобрать под MinGW это шибко долго будет , вчера уже поигрался.

Pasha: Dima пишет: а без пересборки ни как ? ;) Все-таки пересобирать не надо. Хотя в Changelog HB_GTWIN_USE_UNDOC_WINAPI упоминается, в сырцах его уже нет. Можно просто использовать HB_GTI_CLOSABLE

Dima: Pasha Да работает однако.

Sergy: Дабы не плодить темы, спрошу здесь: с удалением "крестика" из текущего окна понятно. Но пытливые умы юзеров не находят лучшего применения, чем напакостить программеру. Нету крестика - вызываем "диспетчер задач" и убиваем приложение. Как с этим бороться ? Есть ли в Harbour какой-нить обработчик наподобие onExit, onClose и тп - чтобы при закрытии приложения корректно выйти из базы ? Спасибо.

PSP: Sergy Посмотри пример для терминала gtwvt: harbour\tests\wvtext.prg

Sergy: PSP пишет: Посмотри пример для терминала gtwvt: harbour\tests\wvtext.prg Спасибо, посмотрю. Не могли-бы Вы еще объяснить - что есть по сути "терминал" в понятиях Harbour ? На Clipper моя программа работает в двух основных режимах: локально на машине с удаленной БД (в офисной сети) и на удаленном сервере, у которого БД локальна (через интернет для иногородних клиентов) через Windows Terminal (удаленный доступ). Нигде специальных танцев с бубнами и "терминальных" библиотек не нужно было... Может я чего-то нужное упускаю ?

Dima: Sergy пишет: Нигде специальных танцев с бубнами и "терминальных" библиотек не нужно было А сейчас понадобились ? Должно и так работать

PSP: Sergy При сборке с помощью hbmk2 можно указать, какой терминал будет использован

Sergy: PSP пишет: При сборке с помощью hbmk2 можно указать, какой терминал будет использован Немного непонятно - нужен ли мне вообще он или нет. Из консольного окна в GUI переходить планов пока нет. Какие удобства/преимущества и тп дают терминальные драйверы для программы ? PS: используется Win2003 как файловый сервер, на нем-же установлен виндовый RDP сервер, т.е. программы, запущенные на нем, видят базу локально. Клиенты - Win XP SP3.

Sergy: Dima пишет: А сейчас понадобились ? Должно и так работать Да просто несколько раз встречался с этим в описаниях Harbour, да и вот отсылка к нему (по поводу возможности убить процесс через диспетчер задач) возникла. Может мне это очень нужно, но я не знаю, зачем...

Pasha: Не могли-бы Вы еще объяснить - что есть по сути "терминал" в понятиях Harbour ? Тоже самое, что в клиппере. Это заменяемая библиотека, которая реализует функции ввода/вывода. Просто в клиппер был сделан только под ms dos, терминалов в нем было мало, и альтернативными терминалами мало кто пользовался. Харбор же используется под множество платформ, и под каждую есть как правило несколько терминалов. Что касается windows, это прежде всего gtwin, который работает через консольные средства windows. Примерно 10 лет назад Peter Rees из Новой Зеландии сделал еще один терминал для windows - gtwvt, которые реализован через стандартные графические средства windows, не использует wincon, и поддерживает 100%-ю функциональность харбора. С ним можно использовать различные шрифты, размеры, есть дополнительная библиотека, позволяющая использовать gui-контролы, что-то вроде псевдо-gui С тех пор можно говорить, что у харбора есть 2 стандартных терминала для windows: gtwin и gtwvt. Чтобы их подключить, достаточно опции скрипта для hbmk2. Можно их оба прилинковать к программе, и использовать при необходимости тот или другой.

PSP: Sergy пишет: Из консольного окна в GUI переходить планов пока нет. Дык, как раз "консольное окно" посредством терминала и создается. По-умолчанию используется gtwin. Мне больше нравится gtwvt, он как-то гибче что ли... Посмотрите тот пример, что я выше указал. Скомпилируйте его. Сразу станет интересней )))

Sergy: Pasha, PSP - спасибо, понял. Запущу проект, потом обязательно займусь "красивостями" второго терминала.

Sergy: PSP пишет: Посмотри пример для терминала gtwvt: harbour\tests\wvtext.prg Посмотрел. Офигенно. НО: диспетчер задач срубает программу без единого звука.

Sergy: Вопрос. Вроде все отладил, но кое-где шаловливые руки юзеров "срубают" задачу несмотря на выключенный крестик. Я вижу это по увеличивающемуся значению переменной err_count. Прихожу, спрашиваю - что да как: в ответ невнятное блеяние что "все зависло, ничего не работало, я вызвал диспетчер задач, снял ее, запустил и снова все заработало". Как-бы грамотно запротоколировать процесс ? Что они там делают - то-ли винду вырубают не выйдя из программы, то-ли диспетчером срубают, то-ли терминальный сеанс завершают, то-ли вообще обходят какие-то программыне ограничения, введенные для младших сотрудников - х.е.з., но хотелось-бы разобраться... EXIT PROCEDURE в таком случае точно не срабатывает. Очень помог-бы снимок экрана или хотя-бы стек вызовов процедур на крайний случай... С какой стороны лучше подступиться и возможно ли это на Harbour ? Как первый вариант: маленькая программа-обертка(запускатель) для главной программы. Если выход из главной программы произошел без установки кода завершения, допустим, 55 - значит программа завершилась неудачно и нужно сохранить снимок экрана для разбора полетов. Может есть способ элегантнее? И я сомневаюсь, что он отработает в случае завершения работы винды или сеанса.

Dima: Снимок экрана наверное не поможет а вот стек процедур да.

petr707: Можно крестик не запрещать, использовать под своим контролем что-то типа(см.ниже) WN_Notifier - можно вызывать и не при нажатии крестика, только задать nEvent(эмуляция) Коды возврата (0 или 1) нужно проверять, они разные для hb20 и hb30, h32 также разные коды для nEvent .. HB_GTINFO( HB_GTI_CLOSABLE , .t. ) HB_GtInfo( HB_GTI_NOTIFIERBLOCK, {|nEvent, ...| WN_Notifier( nEvent, ... ) } ) .... FUNCTION WN_Notifier( nEvent, ... ) Static n_GTE_CLOSE:=0// Номер вхождения .. DO CASE CASE nEvent == HB_GTE_SETFOCUS CASE nEvent == HB_GTE_CLOSE //HB_K_CLOSE n_GTE_CLOSE++ if n_GTE_CLOSE<=1// условие завершения - необязательное - можно требовать два нажатия на крестик и т.д. // завершение работы - здесь записать в лог, закрыть таблицы и прочее return 0 else n_GTE_CLOSE :=0 return 1 endif CASE nEvent == HB_GTE_RESIZED // обработка изменения размера окна OTHERWISE ENDCASE RETURN 0

Sergy: petr707 пишет: HB_GTINFO( HB_GTI_CLOSABLE , .t. ) Это ведь с GTWIN не будет работать ? Нужно под GTWIN. Пока проблем от GTWVT для меня больше, чем преимуществ от его красивостей.

petr707: Можно сделать как в самом Windows При запуске следующего сеанса проверяется неудаленный семафор предыдущего сеанса, определяется что завершение было нерегламентным, поднимаются логи и прочее. Если сеанс свалился по ошибке из ERRORSYS - должен быть файл этого лога. Если по внутренней ошибке - есть hb_out.log Можно завести служебную таблицу статистики сеансов регистировать в нее все сеансы - дата, время -входа, user, комп и дата+время завершения и тд. и смтреть сколько свалов в каком месте. Можно - по настройке - включить лог выполнения функций программы. Можете даже писать это не свои логи, а в журнал приложений Windows(на любителя)

Dima: petr707 пишет: HB_GtInfo( HB_GTI_NOTIFIERBLOCK, {|nEvent, ...| WN_Notifier( nEvent, ... ) } ) Как поймать событие в функции WN_Notifier что окно свернули ? PS Терминал Gtwvt/GtWvg Проехали , придумал как.



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