在小键盘视图打开的情况下启动 TabTip

2023-11-23

我基本上有启动键盘的代码,但它以字母数字部分打开,用于编辑的框是带有数字的 NumericUpDown 。因此,我想打开 tabtip.exe(又名 Windows 8.1 中的屏幕键盘),并聚焦于数字键盘。这是我当前打开 tabtip 的代码,但默认情况下它不会用小键盘打开:

using System.Runtime.InteropServices; //added for keyboard closure
using System.Windows.Interop; //Keyboard closure - must add reference for WindowsBase

//Added for keyboard closure
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(String sClassName, String sAppName);

//open keyboard
void openKeyboard()
{
                ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");
                startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                Process.Start(startInfo);
}

//close keyboard
void closeKeyboard()
{
uint WM_SYSCOMMAND = 274;
                uint SC_CLOSE = 61536;
                IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null);
                PostMessage(KeyboardWnd.ToInt32(), WM_SYSCOMMAND, (int)SC_CLOSE, 0);
}

您似乎还可以进行一些注册表编辑,但我似乎无法使其在 Windows 8.1 中显示 Taptip 键盘的数字键盘部分:

Windows 8 桌面应用程序:打开 tabtip.exe 到辅助键盘(用于数字文本框)


目前,在 Windows 8.1 中,似乎没有太多功能以编程方式公开。 下面的代码将导致 tabtip.exe 读取注册表,因为原始进程被终止。 它并不完全可靠,但它是响应某些注册表值的一种方法。 关于对接的部分是可选的,它通过注册表更改强制它每次都对接。 process.Kill();应该在 try/catch 中,因为它有时没有权限并且可能引发异常。

    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string sClassName, string sAppName);

    [DllImport("user32.dll")]
    public static extern IntPtr PostMessage(int hWnd, uint msg, int wParam, int lParam);

    private static void KillTabTip()
    {
        // Kill the previous process so the registry change will take effect.
        var processlist = Process.GetProcesses();

        foreach (var process in processlist.Where(process => process.ProcessName == "TabTip"))
        {
            process.Kill();
            break;
        }
    }

    public void ShowTouchKeyboard(bool isVisible, bool numericKeyboard)
    {
        if (isVisible)
        {
            const string keyName = "HKEY_CURRENT_USER\\Software\\Microsoft\\TabletTip\\1.7";

            var regValue = (int) Registry.GetValue(keyName, "KeyboardLayoutPreference", 0);
            var regShowNumericKeyboard = regValue == 1;

            // Note: Remove this if do not want to control docked state.
            var dockedRegValue = (int) Registry.GetValue(keyName, "EdgeTargetDockedState", 1);
            var restoreDockedState = dockedRegValue == 0;

            if (numericKeyboard && regShowNumericKeyboard == false)
            {
                // Set the registry so it will show the number pad via the thumb keyboard.
                Registry.SetValue(keyName, "KeyboardLayoutPreference", 1, RegistryValueKind.DWord);

                // Kill the previous process so the registry change will take effect.
                KillTabTip();
            }
            else if (numericKeyboard == false && regShowNumericKeyboard)
            {
                // Set the registry so it will NOT show the number pad via the thumb keyboard.
                Registry.SetValue(keyName, "KeyboardLayoutPreference", 0, RegistryValueKind.DWord);

                // Kill the previous process so the registry change will take effect.
                KillTabTip();
            }

            // Note: Remove this if do not want to control docked state.
            if (restoreDockedState)
            {
                // Set the registry so it will show as docked at the bottom rather than floating.
                Registry.SetValue(keyName, "EdgeTargetDockedState", 1, RegistryValueKind.DWord);

                // Kill the previous process so the registry change will take effect.
                KillTabTip();
            }

            Process.Start("c:\\Program Files\\Common Files\\Microsoft Shared\\ink\\TabTip.exe");
        }
        else
        {
            var win8Version = new Version(6, 2, 9200, 0);

            if (Environment.OSVersion.Version >= win8Version)
            {
                const uint wmSyscommand = 274;
                const uint scClose = 61536;
                var keyboardWnd = FindWindow("IPTip_Main_Window", null);
                PostMessage(keyboardWnd.ToInt32(), wmSyscommand, (int)scClose, 0);
            }
        }
    }

您可以从 TextBox 的自定义版本调用上述方法,其中重写 OnTouchDown 并创建一个附加的 DependencyProperty 来指示该字段是否使用 NumericKeyboard:

    #region NumericKeyboard
    public static readonly DependencyProperty NumericKeyboardProperty = DependencyProperty.Register("NumericKeyboard", typeof(bool), typeof(CustomTextBox), new FrameworkPropertyMetadata(false));

    /// <summary> Returns/set the "NumericKeyboard" state of the CustomTextBox. </summary>
    public bool NumericKeyboard
    {
        get { return (bool)GetValue(NumericKeyboardProperty); }
        set { SetValue(NumericKeyboardProperty, value); }
    }
    #endregion


    protected override void OnTouchDown(TouchEventArgs e)
    {
        base.OnTouchDown(e);
        Focus();

        if (IsReadOnly == false)
            ShowTouchKeyboard(true, NumericKeyboard);
    }

目前,我还没有成功地使用类似的技术在浮动(非停靠)状态下将 TabTip 窗口定位在屏幕周围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在小键盘视图打开的情况下启动 TabTip 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable

随机推荐

  • 如何匹配字符串的开头?

    我想在start字符串切片的 我目前的做法是 fn main let m true other stuff if m starts with true else if m starts with false 但这比我喜欢的更冗长 另一种方法
  • PyCharm 中的部分存根

    我想在我的项目中引入部分类型注释 例如用于超载 我发现 pep561 引入了部分存根文件支持 我用 PyCharm 开发我的项目并添加相应的 pyi文件 并获得了预期的信息 但 PyCharm 报告在 pyi 文件中找不到参考 当 pyi
  • “纱线应用程序-列表”不显示任何结果

    我在 YARN 集群上运行了一些 Spark 应用程序 该应用程序显示在 YARN UI 的 所有应用程序 页面中http 主机 8088 集群但是yarn application list命令没有给出任何结果 这可能是什么原因造成的 当您
  • 无法从表中删除 UNIQUE 索引

    当我运行这个查询时 ALTER TABLE dbo ROOM DROP INDEX UNIQUE 我收到这条消息 错误 1018 INDEX 附近的语法不正确 如果这是作为表提示的一部分 则现在需要WITH 关键字和括号 有关正确语法 请参
  • SVG 图像无法在 Chrome 上加载(有时)

    您好 我已经开始将网站上的许多旧图像转换为 SVG 格式 但无法让它们显示在页面中 如果我单独打开图像 然后在打开后查看页面 则图像会加载 SVG 位于正确的文件路径我正在引用但没有出现任何内容 尽管在某些刷新中它确实出现了 img cla
  • 使用 CRON 作业运行curl 命令

    我想运行这个语句 curl http localhost 8983 solr dataimport command full import 每 10 分钟使用 CRON 作业一次 我该如何实现这一目标 就像是 crontab lt lt E
  • 为什么 Lucene 不支持对现有文档进行任何类型的更新

    我的用例涉及索引 Lucene 文档 然后在将来的多个场合添加指向此现有文档的术语 而无需为每个新术语删除并重新添加整个文档 因为性能 并且不保留原始术语 我确实知道文档无法真正更新 我的问题是why 或者更准确地说 为什么不支持所有形式的
  • 使用 Kotlin 的 Android Realm - 在包含在依赖项解析中后无法更改配置的依赖项

    我正在尝试让 Realm 在我的项目中工作 我的 Kotlin 版本为 1 2 51 并且禁用了 Instant Run 在我的项目中build gradle文件我添加了以下依赖项 classpath io realm realm grad
  • 为 deviceMotionUpdateInterval 设置的更新频率是实际频率吗?

    分析deviceMotion timestamp我发现DeviceMotion中设置的更新频率并不是实际的更新频率 我实现了一个应用程序来测试 如下我所看到的 update frequency actual frequency averag
  • 是否可以在discord.py中通过名称获取频道ID

    标题说明了一切 我想在公会中获取指定名称的频道 ID 但我在文档中找不到任何可以让我这样做的内容 寻找更发达的机器人 例如Mee6 他们可以选择连接到您的服务器并为您的任何文本频道设置欢迎页面 我尝试过类似的事情 channels disc
  • 如何检查给定的日期时间对象是否在两个日期时间“之间”?

    my event Event objects get id 4 current time datetime datetime now 如何检查我当前的时间是否在它们之间 my event start time lt current time
  • 带有蒙版和 RGB 图像的 Numpy/Scipy

    我正在尝试使用skikit learn 为RGB 图像创建蒙版 我想创建一个仅选择等于 0 10 0 的像素的蒙版 即绿色通道上的 10 然后只显示那些像素 这应该是直接的 类似于http scikit image org docs dev
  • 超时异常导致SqlDataReader关闭?

    我正在尝试从数据库中提取一些二进制数据并将它们写入 pdf 文件 在大多数情况下 这一切进展顺利 但偶尔的数据行似乎会抛出一个特定的错误 超时已过 操作完成之前超时时间已过 或者服务器未响应 请记住 这种情况仅发生在少数行上 并且绝不是随机
  • 如何检查用户是否已登录Google+?

    我正在编写一个需要用户登录的应用程序 我想通过 Google 实现它 并按照以下文章设置我的登录活动LoginActivity Android 版 Google 平台入门 Android 版 Google 登录 流程 用户打开我的应用程序
  • 在 NSString 中包含一个变量?

    这很好用 我们都知道 NSString textoutput Hello outLabel text textoutput 但是 如果你想在其中包含一个变量怎么办 NSString声明如下 NSString textoutput Hello
  • JPA - 从计算列设置实体类属性?

    我刚刚在 Glassfish 3 上运行的简单 Java Web 应用程序中掌握 JPA 持久性提供程序是 EclipseLink 到目前为止 我真的很喜欢它 除了 netbeans glassfish 交互中的错误 但有件事我希望能够做到
  • 将数据插入 Oracle 表的最快方法是什么?

    我正在 PL SQL 中编写数据转换 用于处理数据并将其加载到表中 根据 PL SQL Profiler 转换中最慢的部分之一是实际插入到目标表中 该表有一个索引 为了准备加载数据 我使用表的行类型填充一个变量 然后将其插入表中 如下所示
  • 设置吐司的背景颜色使其成为矩形

    如果我设置我的背景颜色Toast with t getView setBackgroundColor ctx getResources getColor R color myorange 新的 Android 4 4 圆形Toast变成了矩
  • 事件和函数之间的区别?

    我是 Node 新手 我正在努力理解事件和函数之间的主要区别 两者都需要触发 那么如果我们无论如何都必须触发事件 为什么我们还需要事件呢 它与触发函数有何不同 示例代码 var events require events var event
  • 在小键盘视图打开的情况下启动 TabTip

    我基本上有启动键盘的代码 但它以字母数字部分打开 用于编辑的框是带有数字的 NumericUpDown 因此 我想打开 tabtip exe 又名 Windows 8 1 中的屏幕键盘 并聚焦于数字键盘 这是我当前打开 tabtip 的代码