diff --git a/ChangeLog.txt b/ChangeLog.txt index 5fba67791b..59030ab175 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,12 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-09-03 20:21 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/gtwin/gtwin.c + + added support for disabling [x] button of console window in older + MS-Windows versions which do not have GetConsoleWindow() function, + i.e. Win9x/ME + 2014-08-27 18:19 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/hbserial.ch * src/rtl/itemseri.c diff --git a/src/rtl/gtwin/gtwin.c b/src/rtl/gtwin/gtwin.c index f75fb6afe1..2793d187b7 100644 --- a/src/rtl/gtwin/gtwin.c +++ b/src/rtl/gtwin/gtwin.c @@ -80,6 +80,7 @@ #include "hbapiitm.h" #include "hbapierr.h" #include "hbwinuni.h" +#include "hbdate.h" #include "hbapicdp.h" @@ -820,6 +821,45 @@ static HB_BOOL hb_gt_win_SetPalette( HB_BOOL bSet, COLORREF * colors ) #endif } +HWND hb_getConsoleWindowHandle( void ) +{ + TCHAR oldTitle[ 256 ], tmpTitle[ 32 ]; + HWND hWnd = NULL; + + if( GetConsoleTitle( oldTitle, HB_SIZEOFARRAY( oldTitle ) ) ) + { + int iTmp = 0; + DWORD dwVal; + + tmpTitle[ iTmp++ ] = TEXT( '>' ); + tmpTitle[ iTmp++ ] = TEXT( '>' ); + dwVal = GetCurrentProcessId(); + do + tmpTitle[ iTmp++ ] = TEXT( 'A' ) + dwVal % 26; + while( ( dwVal /= 26 ) ); + tmpTitle[ iTmp++ ] = TEXT( ':' ); + dwVal = GetTickCount(); + do + tmpTitle[ iTmp++ ] = TEXT( 'A' ) + dwVal % 26; + while( ( dwVal /= 26 ) ); + tmpTitle[ iTmp++ ] = TEXT( '<' ); + tmpTitle[ iTmp++ ] = TEXT( '<' ); + tmpTitle[ iTmp ] = TEXT( '\0' ); + + if( SetConsoleTitle( tmpTitle ) ) + { + HB_MAXUINT nTimeOut = hb_dateMilliSeconds() + 200; + /* repeat in a loop to be sure title is changed */ + do + hWnd = FindWindow( NULL, tmpTitle ); + while( hWnd == NULL && hb_dateMilliSeconds() < nTimeOut ); + SetConsoleTitle( oldTitle ); + } + } + + return hWnd; +} + static HB_BOOL hb_gt_win_SetCloseButton( HB_BOOL bSet, HB_BOOL bClosable ) { static HB_BOOL s_bChecked = HB_FALSE; @@ -833,6 +873,7 @@ static HB_BOOL hb_gt_win_SetCloseButton( HB_BOOL bSet, HB_BOOL bClosable ) #endif HB_BOOL bOldClosable = HB_TRUE; + HWND hWnd; if( ! s_bChecked ) { @@ -848,8 +889,13 @@ static HB_BOOL hb_gt_win_SetCloseButton( HB_BOOL bSet, HB_BOOL bClosable ) } if( s_pGetConsoleWindow ) + hWnd = s_pGetConsoleWindow(); + else + hWnd = hb_getConsoleWindowHandle(); + + if( hWnd ) { - HMENU hSysMenu = GetSystemMenu( s_pGetConsoleWindow(), FALSE ); + HMENU hSysMenu = GetSystemMenu( hWnd, FALSE ); if( hSysMenu ) {