Is it possible to add a working menu with events to a console window? I can add the menu, and it displays submenus, but I can't catch the events. I've been searching for a while, but only found one other person attempting this and there was no answer. Is this not possible? Thanks! -John
#COMPILE EXE
#DIM ALL
#INCLUDE "windows.inc"
GLOBAL gdwOldMenuProc AS DWORD
FUNCTION PBMAIN () AS LONG
gdwOldMenuProc = SetWindowLong ( CONSHNDL, %GWL_WNDPROC, CODEPTR ( MenuProc ) )
PRINT FORMAT$(gdwOldMenuProc)
LOCAL hMenu AS DWORD
LOCAL hMenu1 AS DWORD
hMenu = CreateMenu ( )
hMenu1 = CreateMenu ( )
AppendMenu ( hMenu1, %MF_STRING, 111, "&Open" )
AppendMenu ( hMenu, %MF_POPUP, hMenu1, "&File" )
SetMenu ( CONSHNDL, hMenu )
LOCAL Msg AS TAGMSG
WHILE GetMessage(Msg, %NULL, 0, 0)
TranslateMessage Msg
DispatchMessage Msg
WEND
SetMenu ( CONSHNDL, %NULL )
DestroyMenu hMenu1
DestroyMenu hMenu
SetWindowLong ( CONSHNDL, %GWL_WNDPROC, gdwOldMenuProc )
END FUNCTION
FUNCTION MenuProc ( BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG ) AS LONG
PRINT "!";
SELECT CASE wMsg
CASE %WM_COMMAND
SELECT CASE LOWRD ( wParam )
CASE 111
PRINT "Open File"
EXIT FUNCTION
END SELECT
END SELECT
FUNCTION = CallWindowProc ( gdwOldMenuProc, hWnd, wMsg, wParam, lParam )
END FUNCTION
No, it's not possible. If you call GetLastError after the call to SetWindowLong, it returns error 5: Access denied.
A console is an special window class whose window procedure is implemented in CSRSS.EXE.