Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to open the tablet-mode on-screen-keyboard in C#?

I want to start the new On-Screen-Keyboard (OSK) using code. You can find this one in the taskbar:

New-OSK-Taskbar

(if not there you find it by right clicking the taskbar).

I have already tried the regular:

System.Diagnostics.Process.Start("osk.exe");

But I want to start the other one (not in window mode). Here you see which OSK I want and which one not:

OSK wanted version distinction

How can I start that version? And how can I start it in a certain setting (if possible)?

like image 586
GionSnow Avatar asked Nov 07 '19 10:11

GionSnow


People also ask

How do I enable on screen keyboard in tablet mode?

To open the On-Screen Keyboard Go to Start , then select Settings > Accessibility > Keyboard, and turn on the On-Screen Keyboard toggle. A keyboard that can be used to move around the screen and enter text will appear on the screen.

What is the shortcut key to open on screen keyboard?

The fastest way to open the on-screen keyboard in Windows 10 is the shortcut [Windows] + [Ctrl] + [O]. This way, the on-screen keyboard can be activated immediately if a physical keyboard is available or intact.


1 Answers

By starting a process in command-line

I believe you want to start the following process in Windows 10, as suggested here:

"C:\Program Files\Common Files\microsoft shared\ink\tabtip.exe"

As suggested by @bernard-vander-beken, it's better to use

Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles)

to produce the "C:\Program Files\Common Files\" part of the path to fit different install locations.

Through an API

The previous command-line seems to work in inconsistent ways, in particular it doesn't work twice if the tabtip.exe process is already running.

I found this snippet by @torvin on this thread, which you can use to programmatically show the on-screen keyboard after you've started the tabtip.exe using the command-line solution, otherwise it fails with a COM exception.

class Program
{
    static void Main(string[] args)
    {
        var uiHostNoLaunch = new UIHostNoLaunch();
        var tipInvocation = (ITipInvocation)uiHostNoLaunch;
        tipInvocation.Toggle(GetDesktopWindow());
        Marshal.ReleaseComObject(uiHostNoLaunch);
    }

    [ComImport, Guid("4ce576fa-83dc-4F88-951c-9d0782b4e376")]
    class UIHostNoLaunch
    {
    }

    [ComImport, Guid("37c994e7-432b-4834-a2f7-dce1f13b834b")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface ITipInvocation
    {
        void Toggle(IntPtr hwnd);
    }

    [DllImport("user32.dll", SetLastError = false)]
    static extern IntPtr GetDesktopWindow();
}
like image 175
Corentin Pane Avatar answered Sep 20 '22 11:09

Corentin Pane