# Using HotKeys in Win32lib.

Here's another example of a Win32lib program that was originally posted on the Euphoria mailing list by Eddy Van Esch. It illustrates how you can use the RegisterHotKey() function, and create an event handler to use these user-defined keys.

When this program first starts up, it has a button which hides the window. The only way to restore the window's visibility is through the user-defined hot key combination [CTRL] + [S].

The window's color can also be changed by another two pairs of hot keys.
The [CTRL] + [Z] combination changes the color to Yellow,
and the [CTRL] + [X] combination changes the color to Gray.
This happens whether the window is visible or not.

Eddy had originally used the UnregisterHotKey() function in the program's closing routine, but this function really only needs to be called if you want to change the definition of key combinations dynamically within your program.

-- hotkey2.exw

    -- demo of hiding a window, and getting it back,
    -- or changing colors, by pressing a hotkey combination
    -- originally by Eddy Van Esch, 15/01/2001

    include win32lib.ew
    without warning

    constant
    zWM_HOTKEY = #312,
    zMOD_CTRL = #2,
    key1 = 'S',   -- hotkeys are CTRL S,Z,X... change as necessary
    key2 = 'Z',
    key3 = 'X',

    zRegisterHotKey = registerw32Function( user32,
             "RegisterHotKey",{ C_LONG, C_LONG, C_LONG, C_LONG }, C_LONG ),
    zUnregisterHotKey = registerw32Function( user32,
             "UnregisterHotKey",{ C_LONG, C_LONG }, C_LONG )

    atom ok, myHandle

    sequence msg
    msg="Click  'Hide window'  button to hide this window.\n" &
        "Press hotkey combination CTRL S to show the window again.\n\n" &
        "CTRL Z, and CTRL X change the window's colors."

    constant
    Win1 = create( Window, "HotKey Demo", 0, Default, Default,400, 200, 0 ),
    HideBtn = create( PushButton, "Hide window", Win1,120, 12, 144, 40, 0 ),
    TheTxt = create( LText, msg, Win1, 40, 70, 300, 70, 0 )

    -- Hide button's behavior
    procedure onClick_HideBtn()
      setVisible( Win1, False )  -- Hide the window
    end procedure

    -- Event handler: intercept the hotkey and define what to do with it:
    procedure Events(atom iMsg, atom wparam, atom lparam)

      if iMsg = zWM_HOTKEY then
        if hi_word(lparam) = 'S' then
          --unhide window, can be used to do anything you
          --want here...
          setVisible( Win1, True )
        elsif hi_word(lparam) = 'Z' then
          setWindowBackColor(Win1,Yellow)
          setWindowBackColor(TheTxt,Yellow)
    --    elsif hi_word(lparam) = 'X' then  -- not used
        elsif wparam = 3 then -- using id instead of virtual key value
          setWindowBackColor(Win1,getSysColor(COLOR_BTNFACE))
          setWindowBackColor(TheTxt,getSysColor(COLOR_BTNFACE))
        end if
      end if
    end procedure

    procedure register_keys()
      -- get our window's handle
      myHandle = getHandle(Win1)
      -- register hotkeys with id's of 1, 2, 3
      ok = w32Func(zRegisterHotKey, {myHandle, 1, zMOD_CTRL, key1})
      ok = w32Func(zRegisterHotKey, {myHandle, 2, zMOD_CTRL, key2})
      ok = w32Func(zRegisterHotKey, {myHandle, 3, zMOD_CTRL, key3})
    end procedure

    --
    onClick[HideBtn] = routine_id( "onClick_HideBtn" )
    onEvent[Win1] = routine_id( "Events" )
    onOpen[Win1] = routine_id("register_keys")

    WinMain( Win1, Normal )  --normal event loop

    --------

Note that I'm using the id of the registered hot key to change the color back to Gray, whereas the other hot key events are triggered by the virtual key values.

This would allow you to re-define the value of this hot key combination by using the UnregisterHotKey() / RegisterHotKey() functions, and your event handler would still act appropriately, since it's still looking for an id of (3).

Executing a simple code snippet like the one below, for example, would allow the event handler to change the window to Gray when the user pressed the [CTRL] + [G] key combination.

    constant key4 = 'G'
    ok = w32Func(zUnregisterHotKey, {myHandle, 3})
    ok = w32Func(zRegisterHotKey, {myHandle, 3, zMOD_CTRL, key4})

..end of lesson.

CONTENTS