9

We're working on a desktop WPF app that runs on Windows 7 tablets and are adding some Surface Pro units with windows 8 to the mix.

We noticed immediately that the little keyboard icon no longer displays when a TextBox receives focus. We solved it by running "tabtip.exe" on the MouseDown event for all TextBoxes.

We have some numeric textboxes though (quantity for an item on an order), and want to open the on-screen keyboard for numeric entry, but it opens with qwerty keys by default.

I have been searching extensively for any command-line arguments I can pass to tabtip.exe to change its input mode, but have had no luck. This seems like a trivial task with a metro-style app, but impossible on the desktop side.

Is there a command-line argument to tabtip.exe I can use to accomplish this?

Matthew Fotzler
  • 630
  • 1
  • 6
  • 13

4 Answers4

10

Following on from the answer @tymes provided, here is a quick console app which demonstrates opening the keyboard and changing various settings (C#).:

using System;
using System.Diagnostics;
using Microsoft.Win32;

namespace CSharpTesting
{
    class Program
    {
        /// <summary>
        /// The different layout types on the virtual keyboard.
        /// </summary>
        public enum KeyboardLayoutMode
        {
            Default,
            ThumbLayout,
            Handwriting
        }

        /// <summary>
        /// The registry key which holds the keyboard settings.
        /// </summary>
        private static readonly RegistryKey registryKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\TabletTip\\1.7");

        static void Main(string[] args)
        {
            SetKeyboardDockedMode(true);
            SetKeyboardLayoutMode(KeyboardLayoutMode.ThumbLayout);
            ShowKeyboard(true);
        }

        /// <summary>
        /// Shows the onscreen keyboard.
        /// </summary>
        /// <param name="killExistingProcess">If true, kill any existing TabTip.exe process.</param>
        public static void ShowKeyboard(bool killExistingProcess)
        {
            if (killExistingProcess)
            {
                // If the user presses the close button on the keyboard then TabTip.exe will still run in the background. If we have made registry
                // changes to the keyboard settings, they don't take effect until the process is started again so killing this ensures the keyboard
                // will open with our new settings.
                foreach (var process in Process.GetProcessesByName("TabTip"))
                {
                    process.Kill();
                }
            }

            string onScreenKeyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
            Process.Start(onScreenKeyboardPath);
        }

        /// <summary>
        /// Sets if the keyboard is in docked or floating mode.
        /// </summary>
        /// <param name="isDocked">If true set to docked, if false set to floating.</param>
        private static void SetKeyboardDockedMode(bool isDocked)
        {
            registryKey.SetValue("EdgeTargetDockedState", Convert.ToInt32(isDocked), RegistryValueKind.DWord);
        }

        /// <summary>
        /// Changes the layout mode of the keyboard.
        /// </summary>
        /// <param name="mode">The layout mode to use.</param>
        private static void SetKeyboardLayoutMode(KeyboardLayoutMode mode)
        {
            switch (mode)
            {
                case KeyboardLayoutMode.Handwriting:
                    registryKey.SetValue("KeyboardLayoutPreference", 0, RegistryValueKind.DWord);
                    registryKey.SetValue("LastUsedModalityWasHandwriting", 1, RegistryValueKind.DWord);
                    break;
                case KeyboardLayoutMode.ThumbLayout:
                    registryKey.SetValue("KeyboardLayoutPreference", 1, RegistryValueKind.DWord);
                    registryKey.SetValue("LastUsedModalityWasHandwriting", 0, RegistryValueKind.DWord);
                    // 0 = small, 1 = medium, 2 = large
                    registryKey.SetValue("ThumbKeyboardSizePreference", 2, RegistryValueKind.DWord);
                    break;
                default:
                    registryKey.SetValue("KeyboardLayoutPreference", 0, RegistryValueKind.DWord);
                    registryKey.SetValue("LastUsedModalityWasHandwriting", 0, RegistryValueKind.DWord);
                    break;
            }
        }
    }
}
Barrie
  • 1,444
  • 19
  • 26
  • Hi Barrie, do you know how to get all the register Key Name for TabTip? I'm trying to get a key to enable caps when KeyBoard Open... Thank you – Guillaume Nov 23 '15 at 20:53
  • Prior to showing the on-screen keyboard, you can simulate a press of caps lock if it isn't already on. I think that should work – Barrie Nov 24 '15 at 15:25
  • The basic approach to checking caps lock and then enabling is outline [here](http://stackoverflow.com/a/577422/1240407) and [here](http://stackoverflow.com/a/15089809/1240407) – Barrie Nov 24 '15 at 15:31
9

in HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7 (Windows 8) change the REG_DWORD KeyboardLayoutPreference value of 0 is the regular layout value of 1 is the split keyboard with the numberpad in the middle

the REG_DWORD LastUsedModalityWasHandwriting also has to be 0 or if 1, when tabtip is started again it will open with the pen handwriting area.

Stephan Bauer
  • 9,120
  • 5
  • 36
  • 58
tymes
  • 106
  • 1
  • 2
  • fantastic! This DWORD didn't exist in the registry for me already, so I had to create it. But it definitely has the desired effect. – Matthew Fotzler Aug 08 '13 at 14:39
  • This works great for Windows 8 machines but in Windows 10 the TabTip.exe seems to reset all the registry settings when it is opened. – jaredbaszler Oct 27 '15 at 20:55
  • 1
    @jaredbaszler Windows 10 opens the `handwriting-view` when a stylus is present, the typing-view, otherwise. Until now I have not found any possibilityies to start with `handwriting-view` when no stylus is present. – Michael Mairegger Apr 15 '16 at 09:32
1

You may control input mode by registry setting for Tabtip. Look for the registry entry with name KeyboardLayoutPreference.

  • 1
    I did a search in regedit for that key and received no results. I couldn't find any results on Google about it either. Where does this key go in the registry, and what are some values for it? – Matthew Fotzler Apr 16 '13 at 11:44
1

I've never used win 8 but in win 10 you can use InputScope to control what on-screen keyboard is used:

<TextBox Grid.Row="0"
         InputScope="Number" />
<TextBox Grid.Row="1"
         InputScope="Default" />
Johan Larsson
  • 17,112
  • 9
  • 74
  • 88