2012-04-12 4 views
3

Ich mag eine einfache virtuelle Tastatur in win7 schaffen, in wieVirtuelle Tastatur in WPF: emulieren echtes Eingabegerät?

|---|---|---| 9 char in first block (abcdefgijk) 

|---|---|---| 

|---|---|---|

9 Taste hat, wenn zu einer anderen Ansicht erste Schaltfläche ändern klicken.

|---|---|---| 
a  b c 
|---|---|---| 
e f g  
|---|---|---| 
i j k

Jetzt bin ich verwirrt darüber, wie man auf einen Knopf wie Presse Tastatur kann Char Ausgabe an eine andere Anwendung zu generieren. Ich verwende

System.Windows.Forms.SendKeys.SendWait(sendString); 

aber es funktioniert nicht. Ich weiß, sendString ist korrekt, weil ich es wie Console.WriteLine(sendString); ansehen.

Die andere Frage ist, der Fokus wird nicht zurück zu Schaltfläche, wenn Sie auf die Schaltfläche klicken.

Jeder hat eine Lösung, wie diese Tastatur zu implementieren?

Danke!

Vielen Dank für die Antwort und eigentlich habe ich bereits diese Code es auch ein Problem, wenn ich Knopf viele Male klicken. und Fokus kann auch nicht funktionieren, wenn ich auf Knopf klicke, es immer auf Knopf fokussiere. In diesem Beispiel enthält es nur 2 Schaltfläche. können Sie helfen, diesen Code zu suchen, der Fehler findet. viele denken !!

namespace WpfApplication5 
{ 
    public partial class UserControl1 : UserControl 
    { 
     [DllImport("user32.dll")] 
     public static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern UInt32 GetWindowLong(IntPtr hWnd, int nIndex); 

     private IInputElement focusedInputElement; 
     private Window parentWindow; 
     private List<Button> keyCollection = new List<Button>(); 

     public UserControl1(Window parent) 
     { 
      this.parentWindow = parent; 
      this.setupKeyboardControl(); 
     } 

     public UserControl1(IInputElement elementToFocusOn) 
     { 
      // set focus 
      this.focusedInputElement = elementToFocusOn; 
      // setup this control 
      this.setupKeyboardControl(); 
     } 

     private void setupKeyboardControl() 
     { 
      InitializeComponent(); 
      // add all keys to internal collection 
      this.addAllKeysToInternalCollection(); 
      // install clicks 
      this.installAllClickEventsForCollection(this.keyCollection); 
     } 

     private void addAllKeysToInternalCollection() 
     { 
      // itterate all panels 
      // itterate all buttons 
      // add to list 
      Console.WriteLine("Run at here"); 
      this.keyCollection.Add(A); 
      this.keyCollection.Add(B); 
     } 

     /// <summary> 
     /// Install click events for all keys in a collection 
     /// </summary> 
     /// <param name="keysToInstall"></param> 
     private void installAllClickEventsForCollection(List<Button> keysToInstall) 
     { 
      // itterate all 
      foreach (Button buttonElement in keysToInstall) 
      { 
       // install click event 
       buttonElement.Click += new RoutedEventHandler(buttonElement_Click); 
      } 
     } 

     /* private void Window_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.A) 
       A.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
      else if (e.Key == Key.B) 
       B.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
     }*/ 

     void buttonElement_Click(object sender, RoutedEventArgs e) 
     { 
      // create variable for holding string 
      String sendString = ""; 

      try 
      { 
       // stop all event handling 
       e.Handled = true; 

       // set sendstring to key 
       sendString = ((Button)sender).CommandParameter.ToString(); 

       // if something to send 
       if (!String.IsNullOrEmpty(sendString)) 
       { 
        // if sending a string 
        if (sendString.Length > 1) 
        { 
         // add {} 
         sendString = "{" + sendString + "}"; 
        } 

        // if a focusable element has been specified 
        if (this.focusedInputElement != null) 
        { 
         Console.WriteLine("1",sendString); 
         // set keyboard focus 
         Keyboard.Focus(this.focusedInputElement); 
         // set normal focus 
         this.focusedInputElement.Focus(); 
        } 

        // send key to simulate key press 
        // System.Windows.Forms.SendKeys.Send(sendString); 

        System.Windows.Forms.SendKeys.SendWait(sendString); 
        Console.WriteLine(sendString); 

       } 
      } 
      catch (Exception) 
      { 
       // do nothing - not important for now 
       Console.WriteLine("Could not send key press: {0}", sendString); 
      } 
     } 

     private void UserControl_Loaded(object sender, RoutedEventArgs e) 
     { 
      // if we have specified a parent 
      if (this.parentWindow != null) 
      { 
       // Get this window's handle 
       IntPtr HWND = new WindowInteropHelper(this.parentWindow).Handle; 
       Console.WriteLine("Run in UserControl load"); 
       // style of window? 
       int GWL_EXSTYLE = (-20); 
       // get - retrieves information about a specified window 
       GetWindowLong(HWND, GWL_EXSTYLE); 
       // set - changes the attribute of a specified window - I think this stops it being focused on 
       SetWindowLong(HWND, GWL_EXSTYLE, (IntPtr)(0x8000000)); 
      } 
     } 
    } 
} 
+0

Sie müssen KeyEvents von dort Argumente verwenden, die Sie das Schlüsselzeichen übergeben können – Prabhavith

Antwort

0

Der zuverlässigste Weg, dies zu tun, ist die Win32-API

[DllImport("user32.dll")] 
public static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); 

[DllImport("user32.dll", EntryPoint = "SendInput")] 
public static extern uint SendInput(uint nInputs, InputKeys[] inputs, int cbSize); 

Es ist ein gutes Beispiel dafür, was man mit einer Arbeits Anwendung auf CodePlex

http://wosk.codeplex.com/ komplett tun verwenden möchten

+0

Ich habe bereits diesen Code hinzufügen –

Verwandte Themen