• Welcome to Theos PowerBasic Museum 2017.

Console Menu?

Started by John Thompson, October 08, 2010, 07:33:17 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

John Thompson

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

José Roca

 
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.