c# – 更改EnableDesktopModeAutoInvoke注册表值并使TabTip.exe接受更改
作者:互联网
Windows 10具有“不在平板电脑模式下显示触摸键盘且没有连接键盘”的设置,允许Windows在您触摸文本框时显示触摸键盘.
由于Windows处理此逻辑相当差(在WPF应用程序中很容易被破坏),我想关闭我的应用程序的这个选项,我试图通过更改与此选项对应的注册表值EnableDesktopModeAutoInvoke(简单的注册表. SetValue方法).但是有一个问题 – 触摸键盘应用程序TabTip.exe由于某种原因并没有真正“挂钩”注册表中的更改,并一直显示触摸键盘,直到它重新启动.反之亦然 – 一旦我恢复注册表值,我需要重新启动应用程序以应用更改.
这就是出现这种方法的主要问题 – 启用自动调用选项,一旦TabTip进程启动,它会立即显示键盘.显然,我不喜欢这种视觉副作用对我的应用程序逻辑.
另一点是,在以通常方式更改此设置时,通过Windows设置应用程序,TabTip或任何相关的应用程序或服务不会重新启动.这意味着设置应用程序以某种方式设法更新TabTip进程.我真的想知道它是如何做到的,如果我可以在C#中重现相同的行为,但我不知道如何.
所以,我的问题是 – 如何以编程方式更改EnableDesktopModeAutoInvoke注册表值或“不在平板电脑模式下显示触摸键盘且没有键盘连接”Windows选项,并使TabTip应用程序接受此更改,没有任何可能的视觉方面 – 效果如何?
UPD:
我知道可以通过创建具有特定自动化同行的自定义文本框来使键盘忽略文本框,但这需要替换整个应用程序中的所有文本框,并始终记住我们需要使用新文本框,所以这不是可行的解决方案.我试图消除为主窗口的孩子获得自动化同行的可能性,但这不起作用.
解决方法:
所以我看了很多不同的实现
并且大多数案例使用了一个杀死进程
foreach (Process tabTipProcess in Process.GetProcessesByName(TabTipProcessName))
tabTipProcess.Kill();
或使用关闭键盘
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);
}
所以,我认为你已经拥有的是最好的选择
标签:c,windows,registry,on-screen-keyboard 来源: https://codeday.me/bug/20190710/1425564.html