WPF窗口大小不受TabTip键盘影响。

11

我有一个运行在Windows 8.1平板电脑上的WPF应用程序。该应用程序正在使用以下方法显示虚拟键盘:

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

然而,键盘显示在其上的活动窗口大小不会相应改变,这意味着如果我在窗口中使用了 ScrollViewer 包围所有元素,它不会响应键盘。
有没有办法让我的窗口意识到键盘的存在?
更新
尝试注册窗口的 SizeChanged 事件,但当键盘弹出时它不会被触发。


你是否曾经找到一种方法使ScrollViewer响应TabTip? - itsho
3个回答

2

由于TabTip.exe是一个独立的进程,它不会在您的WPF应用程序中触发任何事件。自Win 8.1以来,tabtip不再自动调整窗口大小。(有很多关于此问题的投诉)

您可以手动使用几种方法来解决这个问题。首先,Win8应用程序有所谓的“LayoutAware”页面。在WPF中可以使用VisualStateManager实现类似的功能。 这相当复杂,可能不是最佳解决方案,但我还是包括了它(VisualStateManager解决方案在这里

另一种方法是从活动进程列表中获取tabtip进程,并计算其宽度和高度,然后使用它手动调整屏幕大小。 如果我没记错,Tabtip的高度大约为270。您还可以在进程出现时直接调整您的屏幕大小。像这样:

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

             //this = your window
             this.Height -= 270;

         }

有另一种更清洁的方法。这有点困难,我自己还没有尝试过。可以抓取进程并在所需位置调整其大小。您可能可以使用Windows API调用“findWindow()”来完成此操作,但据我所知,这种方法并不总是适用于tabtip,您可能需要使用P/Invoke。 为了让您开始,我找到了一些非常好的资源,我不会在此处复制代码而窃取他人的功劳;如何在C#中调整另一个应用程序的窗口大小 使用P/invoke(win32)更改另一个应用程序的大小和位置 希望您会发现这些信息有用。我知道您的感受,并且经常与tabtip自己斗争,比我想象的要多。
脚注:当osk被调用时,将您的最大窗口高度减小并将其移动到屏幕顶部,然后在其关闭时将其放回,这不是更容易吗?

据我所见,VisualStateManager解决方案没有改变滚动内容。我创建了一个小演示来展示原始问题。如果您能指导我如何正确使用您的解决方案,那将非常棒。 - itsho

1
据我所知,如果窗口被最大化或不可调整大小,则会出现这种情况。在打开键盘之前,请确保其状态未被最大化。

1

在我之前提供的答案中,我分享了自己在使用平板电脑方面的研究,并且以下S/O链接可能会对您有所帮助。

平板应用程序、自动旋转和任务栏高度调整

我发现了一些不太好的事情,但也理解了一些要点。取决于键盘,它实际上是否覆盖或者是底部固定任务栏的一部分以及其他打开的任务。如果是这样,那么它将从本质上改变可用的窗口尺寸,几乎就像用户从低分辨率更改为高分辨率(或高/低)一样。这实际上会改变要显示的窗口的视口尺寸。您可以进行钩子操作。

SystemEvents.UserPreferenceChanged and 
SystemEvents.DisplaySettingsChanged 

为了检测和触发所需的任何调整考虑,您需要代码。还有一些关于强制平板电脑保持单一方向的代码。我需要这个功能,因为我们的平板电脑上有一个条形码扫描仪,因此在应用程序运行时,将平板电脑锁定在特定方向上是有意义的。

最后,如何确定您已进入(或退出)平板电脑模式。这显示了如何连接ManagementEventWatcher以检测注册表条目交互式更改,例如旋转或从站点卸载并变成可在平板电脑模式下使用。

根据您的反馈,让您尝试一下这个。从我的TabTip版本(Surface Pro平板电脑)中,在左上角是键盘设置。如果您单击它,它将打开一个对话框,允许不同的键盘样式,包括全宽、缩写、分割键盘甚至可以直接书写的笔。在此之下是一个选项,可以将您的键盘停靠在任务栏上(我在红色圆圈中标出的左侧按钮),而不是悬浮在其他窗口之上(我相信您正在运行)。尝试将键盘设置为DOCKED状态,然后检查平板电脑模式和窗口环境设置是否发生了变化。对我有用。

enter image description here


不幸的是,当打开“TabTip”时,SystemEvents.UserPreferenceChangedSystemEvents.DisplaySettingsChanged都没有被触发。(在W10 1803上测试) - itsho
@Yoav,请查看有关停靠虚拟TabTip键盘的修改意见。 - DRapp
我已经阅读了修订后的评论,但这已经是我的状态,并且提到的事件没有被触发。我怀疑这与W10 V1703及以上版本有关。请查看我的测试者链接。 - itsho
@itsho,你是否也看到了另一个解决方案中关于“ManagementEventWatcher”的上下文,这也有所帮助,但稍后我还会查看你的测试链接。 - DRapp
在我的情况下,我使用的是带有触摸屏的普通PC,因此ManagementEventWatcher对我来说不太相关。问题出在TabTip覆盖了应用程序的某些部分 - 与Windows 8的行为不同 - 参见讨论。 - itsho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接