简体   繁体   English

在杀死TabletKeyboard(TabTip.exe)应用程序的过程后,在wpf中没有恢复到原来的大小

[英]After killing the process for TabletKeyboard(TabTip.exe) application doesn't bring back to its original size in wpf

I have a wpf application which runs on the windows 8 tablet . 我有一个运行在Windows 8平板电脑上的wpf应用程序。 And in order to bring the keyboard for typing when the focus is on any TextBox . 并且当焦点在任何TextBox上时为了键入键盘。

I am invoking the process TabTip.exe to show the keyboard, and when the keyboard is shown my application shrinks. 我正在调用TabTip.exe进程来显示键盘,当键盘显示时我的应用程序缩小了。 And after all manipulation, there is a save button. 在所有操作之后,都有一个保存按钮。 When I click on the save button, the keyboard should disappear and my application should come back to its original size. 当我单击保存按钮时,键盘应该消失,我的应用程序应该恢复到原始大小。

I am killing the process TabTip.exe to close the keyboard, but the application will not get re-sized to its original size . 我正在杀死进程TabTip.exe以关闭键盘,但应用程序将不会重新调整其原始大小。

I tried: 我试过了:

if (process.ProcessName == "TabTip")
{
    Application.Current.MainWindow.VerticalAlignment = VerticalAlignment.Stretch;
    process.Kill();
    Application.Current.MainWindow.Height = SystemParameters.WorkArea.Height;
    Application.Current.MainWindow.Width = SystemParameters.WorkArea.Width;
    Application.Current.MainWindow.WindowState = WindowState.Normal;
    Application.Current.MainWindow.WindowState = WindowState.Maximized;
    break;
} 

Does anybody knows to restore the application to its original size after killing the TabTip.exe? 有人知道在杀死TabTip.exe后将应用程序恢复到原始大小吗?

The Windows 8 keyboard has a number of rendering problems. Windows 8键盘存在许多渲染问题。 These can be mitigated by starting the keyboard in its smaller mode (equivalent to hitting the minimize button). 这些可以通过以较小的模式启动键盘来减轻(相当于按下最小化按钮)。 It plays much better with WPF then, actually minimizing and expanding when the process is launched and closed. 然后,它在WPF中发挥得更好,实际上在启动和关闭进程时最小化和扩展。

This requires launching the process in this mode, and closing it in a nicer way than you are doing right now 这需要在此模式下启动该过程,并以比您现在更好的方式关闭它

Include these libraries: 包括这些库:

using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Interop;

And define this external functions: 并定义这个外部函数:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(String sClassName, String sAppName);

Open the keyboard with: 打开键盘:

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

and close it with: 并关闭它:

public static 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);
    }

This will give you the best behaved windows 8 on screen keyboard you can get. 这将为您提供屏幕键盘上最佳表现的Windows 8。 With any luck it will fix your rendering issues. 运气好的话,它会解决你的渲染问题。

Abin - you asked about closing the keyboard window rather than killing the process. 阿宾 - 你问过关闭键盘窗口而不是杀死进程。 That's what I'm doing in a WPF app and by closing the window, my main application's window will resize as expected. 这就是我在WPF应用程序中所做的事情,通过关闭窗口,我的主应用程序窗口将按预期调整大小。 A quick console app to demonstrate hiding the keyboard is here (note that this assumes you're using the keyboard in docked mode rather than the floating minimal mode): 这里有一个用于演示隐藏键盘的快速控制台应用程序(请注意,这假设您在停靠模式下使用键盘而不是浮动最小模式):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace TabTipTest
{
    class Program
    {
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(String sClassName, String sAppName);

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

        /// <summary>
        /// The command for a user choosing a command from the Window menu (see http://msdn.microsoft.com/en-gb/library/windows/desktop/ms646360(v=vs.85).aspx).
        /// </summary>
        public const int WM_SYSCOMMAND = 0x0112;

        /// <summary>
        /// Closes the window.
        /// </summary>
        public const int SC_CLOSE = 0xF060;

        static void Main(string[] args)
        {
            HideKeyboard();
        }

        /// <summary>
        /// Gets the window handler for the virtual keyboard.
        /// </summary>
        /// <returns>The handle.</returns>
        public static IntPtr GetKeyboardWindowHandle()
        {
            return FindWindow("IPTip_Main_Window", null);
        }

        /// <summary>
        /// Hides the keyboard by sending the window the close command.
        /// </summary>
        public static void HideKeyboard()
        {
            IntPtr keyboardHandle = GetKeyboardWindowHandle();

            if (keyboardHandle != IntPtr.Zero)
            {
                SendMessage(keyboardHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM