5

我有一个在 windows 8 平板电脑上运行的 wpf 应用程序。并且为了在键盘输入时将焦点放在任何TextBox.

我正在调用进程 TabTip.exe 来显示键盘,当显示键盘时,我的应用程序会缩小。在所有操作之后,有一个保存按钮。当我点击保存按钮时,键盘应该消失,我的应用程序应该恢复到原来的大小。

我正在终止进程 TabTip.exe 以关闭键盘,但应用程序不会重新调整为其原始大小。

我试过了:

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;
} 

有人知道在杀死 TabTip.exe 后将应用程序恢复到其原始大小吗?

4

2 回答 2

15

Windows 8 键盘存在许多渲染问题。这些可以通过以较小的模式启动键盘(相当于点击最小化按钮)来缓解。然后它在 WPF 上的表现要好得多,实际上是在进程启动和关闭时最小化和扩展。

这需要以这种模式启动进程,并以比现在更好的方式关闭它

包括这些库:

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

并定义这个外部函数:

[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);

使用以下命令打开键盘:

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

并关闭它:

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

这将为您提供性能最佳的 Windows 8 屏幕键盘。运气好的话,它将解决您的渲染问题。

于 2013-09-27T00:34:42.337 回答
0

Abin - 你问的是关闭键盘窗口而不是终止进程。这就是我在 WPF 应用程序中所做的,通过关闭窗口,我的主应用程序的窗口将按预期调整大小。演示隐藏键盘的快速控制台应用程序在这里(请注意,这假设您在停靠模式而不是浮动最小模式下使用键盘):

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);
            }
        }
    }
}
于 2014-07-23T07:35:23.230 回答