Change language when program is starting

Posted on 2003-03-07
Medium Priority
Last Modified: 2010-04-04
Hi experts,
I used windows98 (Arabic version),in delphi the  default mode for keyboard is English mode,
If I press right (shift+alt)   keys  change to Arabic mode And if I  press left (shift+alt)  keys change to English mode.
I want to put Arabic mode for users that  can edit in Arabic language.
Do any work that can simulate the  pressing right(shift+key)  keys  ?
If have a another solution please send your idea.

Question by:shirin
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Accepted Solution

sfock earned 280 total points
ID: 8091358
the api function ActivateKeyboardLayout should do the job. Take a look at the Windows SDK help for it.

good luck

Expert Comment

ID: 8091391

Try using PostKeyEx32 by Peter Below and add VK_RSHIFT und VK_LSHIFT to it.

Good luck,


 * Procedure PostKeyEx32
 * Parameters:
 *  key    : virtual keycode of the key to send. For printable
 *           keys this is simply the ANSI code (Ord(character)).
 *  shift  : state of the modifier keys. This is a set, so you
 *           can set several of these keys (shift, control, alt,
 *           mouse buttons) in tandem. The TShiftState type is
 *           declared in the Classes Unit.
 *  specialkey: normally this should be False. Set it to True to
 *           specify a key on the numeric keypad, for example.
 * Description:
 *  Uses keybd_event to manufacture a series of key events matching
 *  the passed parameters. The events go to the control with focus.
 *  Note that for characters key is always the upper-case version of
 *  the character. Sending without any modifier keys will result in
 *  a lower-case character, sending it with [ssShift] will result
 *  in an upper-case character!
 *Created: 17.7.98 by P. Below
Procedure PostKeyEx32( key: Word; Const shift: TShiftState;
                     specialkey: Boolean );
    TShiftKeyInfo = Record
                      shift: Byte;
                      vkey : Byte;
    byteset = Set of 0..7;
    shiftkeys: Array [1..3] of TShiftKeyInfo =
      ((shift: Ord(ssCtrl); vkey: VK_CONTROL ),
       (shift: Ord(ssShift); vkey: VK_SHIFT ),
       (shift: Ord(ssAlt); vkey: VK_MENU ));
    flag: DWORD;
    bShift: ByteSet absolute shift;
    i: Integer;
    For i := 1 To 3 Do Begin
      If shiftkeys[i].shift In bShift Then
        keybd_event( shiftkeys[i].vkey,
                     MapVirtualKey(shiftkeys[i].vkey, 0),
                     0, 0);
    End; { For }
    If specialkey Then
      flag := 0;

    keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
    flag := flag or KEYEVENTF_KEYUP;
    keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );

    For i := 3 DownTo 1 Do Begin
      If shiftkeys[i].shift In bShift Then
        keybd_event( shiftkeys[i].vkey,
                     MapVirtualKey(shiftkeys[i].vkey, 0),
                     KEYEVENTF_KEYUP, 0);
    End; { For }
  End; { PostKeyEx32 }

Procedure SendText( S: String );
  Procedure SendRawCharacter( ch : Char );
      i: Integer;
      numStr: String;
      numStr := Format('%4.4d',[Ord(ch)]);
      keybd_event( VK_MENU, MapVirtualKey(VK_MENU, 0),
                   0, 0);
      for i:= 1 to Length(numStr) do
        PostKeyEx32( VK_NUMPAD0 + Ord(numstr[i])-Ord('0'), [], false );
      keybd_event( VK_MENU, MapVirtualKey(VK_MENU, 0),
                   KEYEVENTF_KEYUP, 0);

    flags: TShiftState;
    vcode: word;
    ret  : word;
    i, n : Integer;
    mask : word;
  Begin { SendText }
    For i := 1  To Length(S) Do Begin
      ret := VkKeyScan( S[i] );
      If ret = $FFFF Then
        SendRawCharacter( S[i] )
      Else Begin
        vcode := Lobyte( ret );
        flags := [];
        mask  := $100;
        For n := 1 To 3 Do Begin
          If (ret and mask) <> 0 Then Begin
            Case mask Of
              $100: Include( flags, ssShift );
              $200: Include( flags, ssCtrl );
              $400: Include( flags, ssAlt );
            End; { Case }
          End; { If }
          mask := mask shl 1;
        End; { For }
        PostKeyEx32( vcode, flags, false );
      End; { Else }
    End; { For }
  End; { SendText }

Author Comment

ID: 8092799
thanks for your short but useful answer.

Expert Comment

ID: 9128722
Hi experts,
I used windows98 (English version).
If I press a Button in Delphi Application ; I want to add Arabic Language ( or Arabic Keyboard ) to my windows .
If have a another solution please send your idea.


Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…
In this video, Percona Director of Solution Engineering Jon Tobin discusses the function and features of Percona Server for MongoDB. How Percona can help Percona can help you determine if Percona Server for MongoDB is the right solution for …
Suggested Courses
Course of the Month10 days, 14 hours left to enroll

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question