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));
}
}
}
}
Sie müssen KeyEvents von dort Argumente verwenden, die Sie das Schlüsselzeichen übergeben können – Prabhavith