=====Creating function key macros=====
//by Richard Russell, December 2008//\\ \\ In the //BBC BASIC for Windows// **I**ntegrated **D**evelopment **E**nvironment (i.e program editor and user interface) function keys **F9** to **F12** have no effect, by default. The same is true of function keys **F1** to **F8** when used in conjunction with the **Shift** key. However it is possible to customise these keys so that when pressed they execute a **keyboard macro**, that is have the same effect as pressing a sequence of keys on the keyboard.\\ \\ The most straightforward way of creating a keyboard macro is probably to use the **Macro Recorder** utility which can be found [[/Tools%20and%20Utilities|here]]. An alternative method is to write a short BASIC program for the purpose as described below.\\ \\ Each of the keys (**Shift+F1** to **Shift+F8**, and **F9** to **F12**) has a corresponding entry in the Registry, as follows:\\
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F1
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F2
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F3
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F4
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F5
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F6
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F7
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F8
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F9
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F10
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F11
HKEY_CURRENT_USER\Software\R T Russell\BBC BASIC for Windows\Macros\F12
When one of the keys is pressed the corresponding Registry entry is checked, and if present the macro string stored there is executed.\\ \\ The string associated with a particular macro can be of any (reasonable) length and contains the usual 8-bit (ANSI) character codes corresponding to the required sequence of key-presses. Any character which can be obtained from the keyboard (including those which require the **Shift** and/or **Ctrl** keys to be pressed) may be included in the string. However, character codes which cannot be directly obtained from the keyboard must __not__ be included.\\ \\ So to program the **F12** key to generate **Hello world!** one could use the following simple program:\\
Macro12$ = "Hello world!"
Key$ = "Software\R T Russell\BBC BASIC for Windows\Macros"
SYS "RegCreateKeyEx", &80000001, Key$, 0, "", 0, &F003F, 0, ^K%, ^D% TO R%
IF R% = 0 THEN
SYS "RegSetValueEx", K%, "F12", 0, 3, Macro12$, LEN(Macro12$)
SYS "RegCloseKey", K%
ENDIF
Of course there are several keyboard keys which do not generate characters, but which either modify the action of other keys (e.g. **Shift**, **Ctrl**, **Alt**) or have special actions such as cursor movement or Escape. The function keys themselves are in this category. It is possible to incorporate these keys into a macro string using the special values **CHR$0** or **CHR$255** followed immediately by the [[http://www.kbdedit.com/manual/low_level_vk_list.html|Virtual Key code]] of the key concerned. In the first case (CHR$0+VKcode$) the effect is to **press** the (virtual) key and in the second (CHR$255+VKcode$) to **release** it.\\ \\ So to program the **F11** key so that it alternately adds and removes line numbers to the current program you can do the following:\\
Alt_Down$ = CHR$0+CHR$18
Alt_Up$ = CHR$255+CHR$18
Enter$ = CHR$13
Macro11$ = Alt_Down$+"URR"+Alt_Up$+Enter$
Key$ = "Software\R T Russell\BBC BASIC for Windows\Macros"
SYS "RegCreateKeyEx", &80000001, Key$, 0, "", 0, &F003F, 0, ^K%, ^D% TO R%
IF R% = 0 THEN
SYS "RegSetValueEx", K%, "F11", 0, 3, Macro11$, LEN(Macro11$)
SYS "RegCloseKey", K%
ENDIF
This corresponds to the following sequence of keyboard operations:\\ \\
- Hold down the Alt key
- Press U (open the Utilities menu)
- Press R (select the Renumber menu item)
- Press R (toggle the 'Remove unused line numbers' option)
- Release the Alt key
- Press Enter (activate the OK button)
\\ Note that you should always use the **press** and **release** codes in pairs, so the macro leaves the 'virtual keyboard' in the same state that it found it.\\ \\ You can even create a macro that executes a BASIC program, by generating a sequence of keypresses which will enter 'immediate mode' and run the program from there:\\
Alt_Down$ = CHR$0+CHR$18
Alt_Up$ = CHR$255+CHR$18
Enter$ = CHR$13
Macro1$ = Alt_Down$+"RI"+Alt_Up$+"CALL @lib$+""..\examples\tools\searchbbc"""+Enter$
Key$ = "Software\R T Russell\BBC BASIC for Windows\Macros"
SYS "RegCreateKeyEx", &80000001, Key$, 0, "", 0, &F003F, 0, ^K%, ^D% TO R%
IF R% = 0 THEN
SYS "RegSetValueEx", K%, "F1", 0, 3, Macro1$, LEN(Macro1$)
SYS "RegCloseKey", K%
ENDIF
The corresponding keyboard sequence is as follows:\\ \\
- Hold down the Alt key
- Press R (open the Run menu)
- Press I (select the Immediate Mode menu item)
- Release the Alt key
- Enter the command "CALL @lib$+"..\examples\tools\searchbbc""
- Press Enter
\\ Note that the program is executed using **CALL** rather than **CHAIN** (or **RUN**) so that the existing program in memory, if any, is unaffected. However, care must be taken when writing programs that are intended to be run this way (for example any procedures and functions they contain must have different names from those in the currently-loaded program).