WPF 启动屏幕键盘
在 Windows 的平板模式下才能自动在获取键盘输入焦点时弹出屏幕键盘,但是 Windows 的屏幕键盘做的粗糙,有时候不会自动开启屏幕键盘,此时需要使用代码辅助
如果是非平板模式,以及系统没有检测到触摸,此时不一定能弹出屏幕键盘
在 Win10 版本小于 10.0.14393 时,可以通过启动 TabTip.exe 应用打开屏幕键盘。而在大于等于 10.0.14393 版本需要使用 COM 的方式
先来聊聊如何通过 TabTip.exe 应用打开屏幕键盘
默认的 TabTip.exe 应用将会放在 Program Files
文件夹下,可以通过如下代码拿到 Program Files
文件夹
var commonFilesPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles);//程序集目标平台为X86时,获取到的是x86的Program Files,但TabTip.exe始终在Program Files目录下if (commonFilesPath.Contains("Program Files (x86)")){commonFilesPath = commonFilesPath.Replace("Program Files (x86)", "Program Files");}
此时拿到应用路径可以使用下面代码
var tabTipPath = Path.Combine(commonFilesPath, @"microsoft shared\ink\TabTip.exe");
启动应用,启动之后需要等待一下,下面代码使用 Thread.Sleep(50)
等待,请小伙伴根据需要更改时间或更改为 Task.Delay 等。如果没有后续逻辑依赖键盘,那么可以删除 Thread.Sleep 的代码
var processStartInfo = new ProcessStartInfo{FileName = tabTipPath,UseShellExecute = true,CreateNoWindow = true};Process.Start(processStartInfo);//第一次系统软键盘启动时候,需要缓冲一下Thread.Sleep(50);
如果是 10.0.14393 Windows 10周年纪念版 版本,可以使用 com 的方式启动,在启动之前,可以先判断一下版本号
var minWin10Version = new Version(10, 0, 14393, 0);var isNeedCom = Environment.OSVersion.Version >= minWin10Version;
注意,默认的 .NET 程序是不会让你获取 Environment.OSVersion 到 win10 的版本,详细请看 关于C#中Environment.OSVersion判断操作系统及Win10上的问题 - 夏至千秋 - 博客园
通过 COM 只有 Toggle 方法,也就是如果原本是没有开启的,调用将会开启。否则将会关闭
//使用com组件的方式来打开TabTip.exevar uiHostNoLaunch = new UIHostNoLaunch();// ReSharper disable once SuspiciousTypeConversion.Globalvar tipInvocation = uiHostNoLaunch as ITipInvocation;tipInvocation?.Toggle(Win32.User32.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();
判断屏幕键盘是否开启,在 10.0.14393 Windows 10周年纪念版之前可以采用如下方法
private static IntPtr FindTipMainWindow(){return Win32.User32.FindWindow(KeyboardWindowClass, null);}private const string KeyboardWindowClass = "IPTip_Main_Window";private static bool GetIsOpenLegacy(){var touchHwnd = FindTipMainWindow();if (touchHwnd == IntPtr.Zero){return false;}// 这里需要 unchecked 因为返回的是 int 转换为 WindowStyles 需要忽略负号var style = (Win32.WindowStyles) Win32.User32.GetWindowLongPtr(touchHwnd,(int) Win32.GetWindowLongFields.GWL_STYLE);// 如果满足了下面的条件就可以判断显示键盘// 由于有的系统在键盘不显示时候只是多返回一个WS_DISABLED这个字段。所以加一个它的判断return style.HasFlag(Win32.WindowStyles.WS_CLIPSIBLINGS)&& style.HasFlag(Win32.WindowStyles.WS_VISIBLE)&& style.HasFlag(Win32.WindowStyles.WS_POPUP)&& !style.HasFlag(Win32.WindowStyles.WS_DISABLED);}
如果是 10.0.14393 需要使用下面代码
private const string WindowParentClass = "ApplicationFrameWindow";private const string WindowClass = "Windows.UI.Core.CoreWindow";private const string WindowCaption = "Microsoft Text Input Application";private static bool? GetIsOpenKeyboardWindow(){// if there is a top-level window - the keyboard is closedvar wnd = Win32.User32.FindWindowEx(IntPtr.Zero, IntPtr.Zero, WindowClass, WindowCaption);if (wnd != IntPtr.Zero)return false;var parent = Win32.User32.FindWindowEx(IntPtr.Zero, IntPtr.Zero, WindowParentClass, null);if (parent == IntPtr.Zero)return null; // no more windows, keyboard state is unknown// if it's a child of a WindowParentClass1709 window - the keyboard is openwnd = Win32.User32.FindWindowEx(parent, IntPtr.Zero, WindowClass, WindowCaption);if (wnd != IntPtr.Zero)return true;return null;}// 这是 Win32.User32 的方法public const string LibraryName = "user32";[DllImport(LibraryName, CharSet = Properties.BuildCharSet)]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass,string lpszWindow);[DllImport(LibraryName, CharSet = Properties.BuildCharSet)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
但是在 10.0.18362 版本,上面判断方法在一些设备上凉凉
我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
WPF 启动屏幕键盘相关推荐
- WIN7 启动屏幕键盘
点击"开始"或按快捷键"WIN",输入"osk"后,按"回车键"确定,就可以启动屏幕键盘. 屏幕键盘 另一种方法是进入& ...
- 服务器屏幕键盘在哪个文件夹,远程服务器如何启动屏幕键盘
远程服务器如何启动屏幕键盘 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 云堡 ...
- Win10启动屏幕键盘
键盘突然出现了一点问题,有的按键只能使用屏幕键盘.如何打开屏幕键盘呢? 方法一 打开控制面板从,选择外观与个性化 打开轻松使用设置中心 启动屏幕键盘 启动成功 方法二 win + R 输入osk 启动 ...
- win7系统怎么打开屏幕键盘
win7系统怎么打开屏幕键盘?我们在电脑没有接入键盘或者键盘失灵等情况下,如果想要输入内容,可以使用系统自带的屏幕键盘.只需要在控制面板中打开屏幕键盘就可以使用了,下面就让我们一起看看win7系统屏幕 ...
- win7系统屏幕键盘打开教程
我们在电脑没有接入键盘或者键盘失灵等情况下,如果想要输入内容,可以使用系统自带的屏幕键盘.只需要在控制面板中打开屏幕键盘就可以使用了,下面就让我们一起看看win7系统屏幕键盘打开教程吧. 1.首先点击 ...
- 如何设置可以使计算机在10分钟没有任何操作时启动屏幕保护程序?,Win10设置屏幕保护程序,不用鼠标或键盘一定时长,禁止进入系统...
1989年10月30日,中国青少年发展基金会作出决定:设立救助贫困地区失学少年基金会.这项命名为"希望工程"的救助活动,将长期资助我国贫困地区品学兼优而又因家庭困难失学的孩子重新获 ...
- 【WPF】如何使用wpf实现屏幕最前端的绘图?
[WPF]如何使用wpf实现屏幕最前端的绘图? 原文:[WPF]如何使用wpf实现屏幕最前端的绘图? 引言 在知乎上面看到如何使用wpf实现屏幕最前端的绘图? 这么一个问题,觉得全屏弹幕很有趣,所以把 ...
- C#实现屏幕键盘(软键盘 ScreenKeyboard)
要实现一个屏幕键盘,需要监听所有键盘事件,无论窗体是否被激活.因此需要一个全局的钩子,也就 是系统范围的钩子. 什么是钩子(Hook) 钩子(Hook)是Windows提供的一种消息处理机制平台,是指 ...
- 系统屏幕键盘(软键盘)打开和关闭
系统屏幕键盘(软键盘)打开和关闭 // 打开软键盘 bool OpenOSK() { HWND appWnd = ::FindWindow(L"OSKMainClass", NUL ...
- linux 软键盘输入密码,Linux_Linux系统中使用屏幕键盘的方法,屏幕键盘可以作为实体键盘输 - phpStudy...
Linux系统中使用屏幕键盘的方法 屏幕键盘可以作为实体键盘输入的替代方案.在某些时候,屏幕键盘显得非常需要. 比如, 你的键盘刚好坏了:你的机器太多,没有足够的键盘:你的机器没有多余的接口来连接键盘 ...
最新文章
- tp5 异步处理_tp5.1 swoole 实现异步处理
- Polycarp Restores Permutation
- java什么时候新建进程_创建名为“ {java}”的线程(即轻量级进程)是为了什么?...
- canvas 圆角矩形填充_一篇文章让你学会你最“害怕”的Canvas,太有意思了
- Bootstrap圣诞节主题商城网站模板
- Lamda和kappa架构
- 项目架构中遇到需考虑的问题
- linux命令的-和--参数问题
- Vue-cli proxyTable 解决开发环境的跨域问题(转)
- Selenium处理Select控件
- Android添加受保护广播
- 安卓pdf 控件使用说明
- Java+SSM+Jsp+Mysql项目大学生健康管理系统
- 11x 程序员专属 TapTap 代码编辑器主题
- Linux mail 配置
- 1467: 平面点排序(一)(结构体专题)
- win10专业版2020下载链接
- VirtualProtect 3方法 -seh ret-ASLR-dep-Adrenalin Player 2.2.5.3
- qgraphicsitem 复制副本,QGraphicsItem:调用paint函数时
- 【云原生 | 从零开始学Kubernetes】十、k8sPod节点亲和性和反亲和性
热门文章
- html表格中的字体上下居中 css,css 文字垂直居中实现方法总结
- iOS开发直播app-美颜滤镜GPUImageBeautifyFilter
- Pycharm 专业版与社区版的区别
- Radon变换与Matlab代码
- 区块链技术从入门到精通教程
- Ubuntu24.04下向日葵,CUDA,cuDNN的详细安装,亲测有效
- Android: 页面元素抓取工具Weditor
- windows android ndk开发,Windows系统下配置Android NDK开发环境
- MySql安装版安装最新教程(附错误解决 )
- hpsocket实现HTTP通信功能