2013-05-17 7 views
5

Ho un'applicazione wpf che gira sul tablet Windows 8. E al fine di portare la tastiera per la digitazione quando lo stato attivo è su qualsiasi .Dopo aver ucciso il processo per TabletKeyboard (TabTip.exe) l'applicazione non riporta alla sua dimensione originale nel wpf

Sto richiamando il processo TabTip.exe per mostrare la tastiera, e quando viene mostrata la tastiera la mia applicazione si restringe. E dopo ogni manipolazione, c'è un pulsante salva. Quando faccio clic sul pulsante Salva, la tastiera dovrebbe scomparire e la mia applicazione dovrebbe tornare alla sua dimensione originale.

Sto uccidendo il processo TabTip.exe per chiudere la tastiera, ma l'applicazione non verrà ridimensionata alla sua dimensione originale.

ho provato:

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

Fa qualcuno sa per ripristinare l'applicazione alla sua dimensione originale dopo aver ucciso il Tabtip.exe?

+0

ho provato tutte quelle cose come se (processo. 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; interruzione; } } –

+0

Sembra decisamente un modo per NON fare cose. Perché lo stai creando/uccidendo da solo? Non dovresti essere consapevole di questa cosa. –

+1

senza uccidere il processo la tastiera non verrà chiusa o nascosta .. !! nessun altro modo per eseguire quelle azioni? –

risposta

15

La tastiera di Windows 8 presenta numerosi problemi di rendering. Questi possono essere mitigati avviando la tastiera nella sua modalità più piccola (equivalente a premere il pulsante minimizza). Funziona molto meglio con WPF, quindi minimizza ed espande quando il processo viene avviato e chiuso.

Questo richiede di avviare il processo in questa modalità, e chiudere in un modo più bello di quello che stanno facendo in questo momento

Includere queste librerie:

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

E definire questo funzioni esterne:

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

Aprire la tastiera con:

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

e chiuderlo con:

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

Questo vi darà le finestre meglio educati 8 sulla tastiera a schermo è possibile ottenere. Con un po 'di fortuna risolverà i problemi di rendering.

+1

Se questo risponde alla tua domanda per favore accetta. –

0

Abin - hai chiesto di chiudere la finestra della tastiera anziché uccidere il processo. Questo è quello che sto facendo in un'app WPF e chiudendo la finestra, la finestra dell'applicazione principale verrà ridimensionata come previsto. Una console app rapido per dimostrare che nasconde la tastiera è qui (si noti che questo presuppone che si sta utilizzando la tastiera in modalità ancorata piuttosto che la modalità minima flottante):

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