posted June 11, 2003 08:09 PM
'------------------------------------------------------------------------------
' Examples of console mode switching between full-screen and windowed modes.
' by Lance C. Edmonds, 2001-2003.
'
' Note: This code uses undocumented Windows functions. Use at your own risk.
'------------------------------------------------------------------------------
#COMPILE CON
#INCLUDE "WIN32API.INC"
%ID_SWITCH_CONSOLEMODE = &hE00F
%CONSOLE_FULLSCREEN = 1 ' fullscreen console
%CONSOLE_FULLSCREEN_HARDWARE = 2 ' console owns the hardware
DECLARE FUNCTION SetConsoleDisplayMode ALIAS "SetConsoleDisplayMode" ( _
BYVAL hOut AS LONG, _ ' STDOUT handle
BYVAL dwNewMode AS DWORD, _ ' The new display mode
BYREF lpdwOldMode AS DWORD) AS LONG ' The old mode stored here
DECLARE FUNCTION GetConsoleDisplayMode ALIAS "GetConsoleDisplayMode" ( _
BYREF lpdwMode AS DWORD) AS LONG ' The mode stored here (%CONSOLE_xxx)
'------------------------------------------------------------------------------
' Return true if OS is Windows NT 4.0 or later
'
FUNCTION IsWinNT() EXPORT AS LONG
LOCAL vi AS OSVERSIONINFO
vi.dwOsVersionInfoSize = SIZEOF(vi)
GetVersionEx vi
FUNCTION = (vi.dwPlatformId = %VER_PLATFORM_WIN32_NT)
END FUNCTION
'------------------------------------------------------------------------------
' Return console handle
'
FUNCTION GetConsHWnd() AS DWORD
LOCAL a AS STRING
LOCAL b AS STRING
#IF %PB_REVISION < &H300
a = CONSNAME$
b = "CONSID:" & STR$(GetTickCount)
CONSOLE NAME b
SLEEP 250
FUNCTION = FindWindow(BYVAL %NULL, BYVAL STRPTR(b))
CONSOLE NAME a
#ELSE
FUNCTION = CONSHNDL
#ENDIF
END FUNCTION
'------------------------------------------------------------------------------
' Return 1 if running in Full Screen Mode, 0 if not.
'
FUNCTION IsFullScreen() AS DWORD
LOCAL Rct AS RECT
GetWindowRect GetConsHWnd, Rct
IF ABS(Rct.nTop) > 2000 THEN
IF ABS(Rct.nLeft) > 2000 THEN
FUNCTION = 1
END IF
END IF
END FUNCTION
'------------------------------------------------------------------------------
' Return a Verbose screen mode string (0 = windowed, 0 <> full-screen)
'
FUNCTION ScreenMode(BYVAL lMode AS LONG) AS STRING
IF lMode <> 0 THEN
FUNCTION = "Full-screen"
ELSE
FUNCTION = "Windowed"
END IF
END FUNCTION
'------------------------------------------------------------------------------
' Main application entry point...
'
FUNCTION PBMAIN
IF IsWinNT THEN
' NT full-screen mode
DIM hKernel32 AS DWORD
DIM pSetConsoleDisplayMode AS DWORD
DIM pGetConsoleDisplayMode AS DWORD
DIM hOut AS LONG
DIM dwOldMode AS DWORD
DIM Result AS LONG
hKernel32 = LoadLibrary("KERNEL32.DLL")
pSetConsoleDisplayMode = GetProcAddress(hKernel32, "SetConsoleDisplayMode")
pGetConsoleDisplayMode = GetProcAddress(hKernel32, "GetConsoleDisplayMode")
IF pGetConsoleDisplayMode THEN
dwOldMode = 0
CALL DWORD pGetConsoleDisplayMode USING GetConsoleDisplayMode(dwOldMode) TO Result
ELSE
dwOldMode = ISTRUE IsFullScreen()
END IF
PRINT "The current display mode is: " ScreenMode(dwOldMode)
#IF %PB_REVISION < &H300
hOut = GetStdHandle(%STD_OUTPUT_HANDLE)
#ELSE
hOut = GETSTDOUT
#ENDIF
IF pSetConsoleDisplayMode THEN
PRINT "Switching to Full-screen..."
CALL DWORD pSetConsoleDisplayMode USING SetConsoleDisplayMode(hOut, 1, dwOldMode) TO Result
SLEEP 10000
PRINT "Switching to Windowed..."
CALL DWORD pSetConsoleDisplayMode USING SetConsoleDisplayMode(hOut, 0, dwOldMode) TO Result
FreeLibrary hKernel32
END IF
ELSE
' Win9x screen-mode toggle
dwOldMode = IsFullScreen()
PRINT "The current display mode is: " & ScreenMode(dwOldMode)
PRINT "Toggling the console from " & ScreenMode(dwOldMode) & _
" to " & ScreenMode(dwOldMode = 0) & "..."
CALL SendMessage(GetConsHWnd, %WM_COMMAND, %ID_SWITCH_CONSOLEMODE, 0)
END IF
PRINT "Press a key..."
INPUT FLUSH
WAITKEY$
END FUNCTION
------------------
Lance
PowerBASIC Support
support@powerbasic.com