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

时间:2015-05-27 12:27:49

标签: c# wpf windows-8.1 virtual-keyboard

我在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事件,但当键盘弹出时不会引发。

3 个答案:

答案 0 :(得分:2)

由于TabTip.exe是一个单独的进程,因此不会触发WPF应用程序中的任何事件。由于win 8.1,tabtip不再自动调整窗口大小。 (对此有很多抱怨)

有两种方法可以手动执行此操作。首先,Win8应用程序具有所谓的“ LayoutAware”页面。可以使用VisualStateManager在WPF中完成类似的操作。 这相当复杂,可能不是最佳解决方案,但尽管如此,我还是将其包括在内(VisualStateManager solution here

另一种方法是从活动进程列表中获取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。 为了让您入门,我发现了一些很棒的资源,我不会通过在此处复制代码来窃取信誉。 How to resize another application's window in C#

Changing another applications size and position using P/invoke (win32)

希望此信息对您有所帮助。我知道您的感受,而我自己经常不喜欢tabtip。

脚注;

在调用osk时降低最大窗口高度并将其移到屏幕顶部不是很容易吗?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在我自己对平板电脑的研究中提供的另一个答案中,以下S / O链接可能会对您有所帮助。

Tablet App, Auto Rotation and Taskbar Height Adjustments

我发现了很多不好的东西,但确实提出了一些理解要点。根据键盘的不同,它实际上是否会覆盖,或者它是否与其他打开的任务一起位于窗口底部的定位任务栏中。如果是这样,这将本质上改变窗口的可用尺寸,就像用户从较低分辨率更改为较高分辨率(或高/低)一样。实际上,这将更改要显示的窗口的视口尺寸。您可以加入

SystemEvents.UserPreferenceChanged and 
SystemEvents.DisplaySettingsChanged 

检测并触发所需的任何调整大小注意事项。还提供了有关强制平板电脑保持单一方向的代码。我之所以需要这样做,是因为我们的平板电脑上装有条形码扫描仪,并且始终让装有扫描仪的平板电脑不指向人是有意义的,因此我们在应用运行时将其锁定在特定的方向上。

最后,您如何知道已进入(或退出)平板电脑模式。这显示了如何与ManagementEventWatcher进行连接,以检测注册表项何时进行交互更改(例如旋转或从工作站取消对接并可以在平板电脑模式下自由使用)。

根据您的反馈,让我们尝试一下。在我的TabTip(Surface Pro平板电脑)版本中,左上方是键盘设置。由此,如果您单击它,它将打开一个对话框,该对话框允许使用全宽,缩写,拆分键盘甚至手写笔等不同的键盘样式以直接进行书写。在该选项下,可以将键盘固定为任务栏(我用红色圆圈圈出的左键)与其他顶部的浮动窗口固定(我相信您的键盘正在运行)。尝试将键盘设置为DOCKED状态,然后检查数位板模式和窗口环境设置是否已更改。为我工作。

enter image description here