Windows 10 设置了“未处于平板电脑模式且未连接键盘时显示触摸键盘”,这允许 Windows 在您触摸文本框时显示触摸键盘。
由于 Windows 处理这个逻辑相当糟糕(它在 WPF 应用程序中很容易被破坏),我想为我的应用程序关闭这个选项,我试图通过更改注册表值 EnableDesktopModeAutoInvoke
来完成,对应于这个选项(简单的 Registry.SetValue
方法)。但是有一个问题 - 触摸键盘应用程序 TabTip.exe
由于某种原因并没有真正“连接”注册表中的更改,并且在重新启动之前一直显示触摸键盘。反之亦然 - 一旦我恢复注册表值,我需要重新启动应用程序以应用更改。
这就是这种方法的主要问题出现的地方 - 启用自动调用选项后,一旦 TabTip 进程启动,它会立即显示键盘。显然,我不希望我的应用程序逻辑出现这种视觉副作用。
另一点是,虽然以通常的方式更改此设置,但不会通过 Windows 设置应用程序、TabTip 或任何相关应用程序或服务重新启动。这意味着设置应用程序以某种方式设法更新 TabTip 进程。我真的很想弄清楚它是如何做到这一点的,以及我是否可以在 C# 中重现相同的行为,但我不知道如何做到。
所以,我的问题是 - 如何以编程方式更改 EnableDesktopModeAutoInvoke
注册表值或“在未处于平板电脑模式且未连接键盘时显示触摸键盘”Windows 选项,并使 TabTip 应用程序接受此更改,而没有任何可能的视觉方面 -效果?
UPD:
我知道可以通过使用特定的自动化对等点创建自定义文本框来使键盘忽略文本框,但这需要替换整个应用程序中的所有文本框,并且始终记住我们需要使用新的文本框,所以这不是可行的解决方案。我也试图消除为主窗口的 child 获得自动化同行的可能性,但这不起作用。
最佳答案
所以我看了很多相同的不同实现
https://github.com/maximcus/WPFTabTip/blob/65b58e1900d3c21c9ea684e9f882088fe821586b/WPFTabTip/TabTip.cs
https://github.com/zhangtx2812/NewClient/blob/851f6dd8bc9c6389b70c7b5cd9384617a62a274e/Client.Helpers/Utils/KeyboardHelper.cs
https://github.com/Anneliese1989/Examintion/blob/2f974312d1ce0452a018bcaecf7bda753c818d9e/WPFTabTip/TabTip.cs
https://github.com/TransposonY/GestureSign/blob/11395ba6f18ea39b86f8e0a586b10a43f3c27568/GestureSign.CorePlugins/TouchKeyboard/TouchKeyboardUI.xaml.cs
https://github.com/microdee/mp.essentials/blob/d5832dee693839d55157d287d2459760b90b1d05/windows/WindowsLaunchOSKNode.cs
并且大多数情况下使用杀死进程
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# - 更改 EnableDesktopModeAutoInvoke 注册表值并使 TabTip.exe 接受更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50334101/