The Language Bar is not showing the configured custom keyboards

Version 1

    Problem

    When setting custom keyboards with RES ONE Workspace by using a User Registry / Policy or restoring them by using User Settings they are not shown on the Language Bar.
     
    This problem occurs when you are using a Mandatory user profile. You will only see the local default keyboard or the one which has been set in the Mandatory profile.
     
    However when you check the following registry keys:
     
    - HKEY_CURRENT_USER\Keyboard Layout\Preload
    - HKEY_CURRENT_USER\Keyboard Layout\Substitutes
     
    You will notice that when you have configured User Settings that they are getting applied correctly, also when you check the General tab of the Language Bar settings the custom keyboard will be present at the Installed Services section.

     

    Cause

    This is default Microsoft Windows behavior.
     
    With a roaming or local profile the user`s language or keyboard settings are applied with the next logon. This is not possible when a mandatory profile is used.
     
    With a mandatory profile the Custom Keyboard settings are only read once during the User Initialization.
    This implies that the settings need to be present before the User Initialization takes place for Microsoft Windows to notice them, any changes made beyond that point will be ignored completely.


     

    Solution

    This issue is not related to RES ONE Workspace and will occur without the product installed.  

    Since the settings need to be in place before RES ONE Workspace starts, RES ONE Workspace cannot be used to apply those settings.

    Solution 1:

    The keyboards can also easily be added to the mandatory profile.
     
    1) Rename the NTUser.man to NTUser.dat. 
    2) Log on once with a template user.
    3) Add the custom keyboard layouts to the language bar.
    4) Log off
    5) Rename NTUser.dat back to NTUser.man.
     
    Note:

    User Settings will not do the job, because it is launched after the Shell Init.


    Solution 2:

     
    Create a custom adm(x) template in which you enable the Custom Keyboard layouts and link this to a GPO in Active Directory. This template needs to be created as for Microsoft does not provide an adm(x) file for setting Custom Keyboards. 
     
    Take note of the following:
     
    - Configuring a Registry Policy with RES ONE Workspace is not going to work as for this will get applied after the User Init has run and therefore will not be read by Microsoft Windows.
     
    - Creating a User Setting to apply changes a user has made to the Custom Keyboard Layouts is also not working as for this will also be applied after the User init and therefore will not be read by Microsoft Windows.

    ###################################################################################################
     
    Below is an example of an ADM file to set Custom Keyboard layouts in the language bar, for other layouts the code can be changed to reflect the specific keyboard layouts the customer needs.
     
    Note:
     
    - This is an example code, not a solution, and thus not supported by RES.
    - This code will not install the additional languages so these will have to be installed on the system first.
    - No Advanced Key Settings and Hot Keys are set with this policy but can be added.
     
    To test with this just copy & paste the code below into notepad and save it as an adm file, for example KeyboardLayout.adm
     
    ;;;;;;;;;;;;;;;;;;;;
    CLASS USER   ;;;
    ;;;;;;;;;;;;;;;;;;;;
     
      CATEGORY "Keyboard Layout"
         POLICY "Keyboard Layout switching"                  ; Enable or disable the automatic keyboard switching ;
         KEYNAME "Software\Microsoft\Windows\CurrentVersion\Run"
           VALUENAME "ctfmon"                                        
           VALUEON "ctfmon.exe"                                     
           VALUEOFF DELETE
         END POLICY
     
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; Example for a Dutch keyboard with US-International as a custom layout                                                    ; 
    ; When more keyboards with custom layout are needed copy & paste the code between                            ;
    ; PART ... END PART SECTION and adjust the VALUE`s to reflect the proper keyboard layout                    ;
    ; More values for custom keyboard layouts can be found at:                                                                         ;
    ;  HKLM\System\CurrentControlSet\Control\Keyboard Layout\DosKeybCodes                                              ;
    ; and HKLM\System\CurrentControlSet\Control\Keyboard Layouts\                                                               ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
       
         POLICY "Keyboard Layout"
         KEYNAME "Keyboard Layout\preload"
           PART "Dutch (US-International)" CHECKBOX
                 VALUENAME "1"                                             ; This will become the default keyboard ;
                 VALUEON "00000413"
                 VALUEOFF "00000000"
             ACTIONLISTON
               KEYNAME "Keyboard Layout\Substitutes"
        VALUENAME "00000413"                        ; Substitute Dutch keyboard layout      ;
                 VALUE "00020409"                                         ; for US-International                            ;
             END ACTIONLISTON
             ACTIONLISTOFF
               KEYNAME "Keyboard Layout\Substitutes"
        VALUENAME "00000413" 
                 VALUE "00000000"
             END ACTIONLISTOFF
           END PART
     
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; Example for some standard keyboards with standard keyboard layout ; 
    ; No ACTIONLISTON and ACTIONLISTOFF are needed for this                ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     
           PART "Danish (Standard)" CHECKBOX
                 VALUENAME "2"
                 VALUEON "00000406"
                 VALUEOFF "00000000"
           END PART
           PART "French (Standard)" CHECKBOX
                 VALUENAME "3"
                 VALUEON "0000040c"
                 VALUEOFF "00000000"
           END PART
           PART "German (Standard)" CHECKBOX
                 VALUENAME "4"
                 VALUEON "00000407"
                 VALUEOFF "00000000"
           END PART
           PART "Hungarian (Standard)" CHECKBOX
                 VALUENAME "5"
                 VALUEON "0000040e"
                 VALUEOFF "00000000"
           END PART
           PART "Polish (Standard)" CHECKBOX
                 VALUENAME "6"
                 VALUEON "00000415"
                 VALUEOFF "00000000"
           END PART
         END POLICY
     
      END CATEGORY