Found in an e-mail to Peg, sent by Torben Jensby Christensen
We have been experimenting with mixing Arabic and standard Western Eropean
fields on the same screen.
For this to work as seamlessly as possible for the users we are changing
keyboard and writing direction on every field entry.
Following code is working with Progress 9.1
DEFINE VARIABLE we-keyboard AS CHARACTER INIT "00000409":U NO-UNDO. DEFINE VARIABLE arabic-keyboard AS CHARACTER INIT "00000429":U NO-UNDO. /* Used for change input keyboard behaviour (Arabic) */ PROCEDURE LoadKeyboardLayoutA EXTERNAL "user32.dll": /* Input paramets klid : keyboard layout id 00000401: Arabic (Saudi Arabia, Iraq, Egypt, Libya, Algeria, Jordan ....) 00000402: Bulgaria 00000405: Czech 00000406: Danish 00000407: German Standard 00000409: English US 0000040a: Spanish 0000040b: Finnish 0000040c: French_Standard 0000040d: Hebrew 00000410: Italian 00000413: Dutch_Standard 00000414: Norwegian 00000415: Polish 0000041a: Croatian 0000041d: Swedish 00000429: Farsi 00000807: German_Swiss 00000809: English United Kingdom 0000080a: Spanish Latin 0000080c: French_Belgian 00000813: Dutch_Belgian 00000816: Portuguese flags: specifies how the keyboard layout is to be loaded KLF_ACTIVATE &1H KLF_NOTELLSHEL KLF_REORDER KLF_REPLACELANG KLF_SUBSTITUTE_OK KLF_UNLOADPREVIOUS See keyboard layout id at: http://www.microsoft.com/globaldev/winxp/xp-lcid.asp */ DEFINE INPUT PARAMETER klid AS CHARACTER. DEFINE INPUT PARAMETER flags AS LONG. END. FUNCTION set-keyboard RETURNS LOGICAL (INPUT lng AS CHAR ). DEFINE VARIABLE klid AS CHARACTER INIT "00000409":U NO-UNDO. IF lng <> "ARABIC":U AND lng <> "NORMAL":U THEN DO: MESSAGE "set-keyboard":U SKIP "Must be called with Arabic or normal":U SKIP lng VIEW-AS ALERT-BOX ERROR BUTTONS OK. RETURN FALSE. END. IF lng = "ARABIC":U THEN DO: /* klid = "00000429":U. arabic farsi keyboard */ klid = arabic-keyboard. END. ELSE DO: /* klid = "00000409":U. English US keyboard */ klid = we-keyboard. END. ASSIGN klid = "00000409":U WHEN klid = "". RUN LoadKeyboardLayoutA IN THIS-PROCEDURE (INPUT klid,INPUT 1). /* arabic farsi keyboard */ RETURN TRUE. END FUNCTION. FUNCTION set-field-direction RETURNS LOGICAL (INPUT fillin-or-editor AS HANDLE,INPUT direction AS CHAR). DEFINE VARIABLE styles AS INTEGER NO-UNDO. IF direction <> "R2L":U AND direction <> "L2R":U THEN DO: MESSAGE "set-field-direction":U SKIP "Must be called with R2L or L2R":U SKIP direction VIEW-AS ALERT-BOX ERROR BUTTONS OK. RETURN FALSE. END. IF direction = "R2L":U THEN DO: /* styles = 4608. /* R2L arabic field */ */ styles = 29184. /* R2L + Scrollbar left Arabic field */ END. ELSE DO: styles = 512. /* L2R Normal WE field */ END. RUN SetWindowLongA IN THIS-PROCEDURE (INPUT fillin-or-editor:HWND ,INPUT -20,INPUT styles). RETURN TRUE. END FUNCTION. /* Used for fill-in and not large editor behaviour (Arabic) */ PROCEDURE SetWindowLongA EXTERNAL "user32.dll": /* Input parameters hdwnd HWND handle of fill-in or editor offs -20 for Extended windows styles newlong 4608 for arabic 29184 for arabic with vertical scrollbar 512 for WE */ DEFINE INPUT PARAMETER hdwnd AS LONG. DEFINE INPUT PARAMETER offs As LONG. DEFINE INPUT PARAMETER newlong AS LONG. END.