==== KbdOpen ====
**Bindings**: [[open#C bindings|C]], [[open#MASM bindings|MASM]]
This call creates a new logical keyboard.
KbdOpen (KbdHandle)
//KbdHandle// (**PHKBD**) - output
Address of the logical keyboard.
//rc// (**USHORT**) - return
Return code descriptions are:
|0 |NO_ERROR |
|440 |ERROR_KBD_NO_MORE_HANDLE |
|441 |ERROR_KBD_CANNOT_CREATE_KCB |
|464 |ERROR_KBD_DETACHED |
|504 |ERROR_KBD_EXTENDED_SG |
**Remarks**
//KbdOpen// blocks while another thread has the keyboard focus (by way of //[[getfocus|KbdGetFocus]]//) until the thread with the focus issues //[[freefocus|KbdFreeFocus]]//. Therefore, to prevent //KbdOpen// from blocking, it is recommended that //KbdOpen// be issued only while the current thread has the focus. For example:
//[[getfocus|KbdGetFocus]]// wait until focus available on handle 0
//KbdOpen// get a logical keyboard handle
//KbdOpen// get another logical keyboard handle
//KbdOpen// get yet another logical keyboard handle
//[[freefocus|KbdFreeFocus]]// give up the focus on handle 0.
=== C bindings ===
#define INCL_KBD
USHORT rc = KbdOpen(KbdHandle);
PHKBD KbdHandle; /* Keyboard handle */
USHORT rc; /* return code */
=== MASM bindings ===
EXTRN KbdOpen:FAR
INCL_KBD EQU 1
PUSH@ WORD KbdHandle ;Keyboard handle
CALL KbdOpen
Returns WORD