Использование встроенной экранной клавиатуры Windows в приложении WPF
Мне нужно использовать компонент OnScreenKeyboard, такой как Native Windows OSK, в моем Wpf-приложении. Я могу вызвать пользовательский интерфейс через Process.Start("osk.exe"), но пользовательский интерфейс отображается в верхней части главного окна пользовательского интерфейса. Я хочу запустить приложение OSK внизу моего приложения. Возможно ли это с какими-либо аргументами? -eg process.StartInfo.WindowPosition=xxx- Я бы предпочел использовать его, прежде чем создавать свой собственный компонент.
1 ответ
ХОРОШО. Я решил свою проблему с Win32 методом SetWindowPos. Поделиться, если это может помочь другим. Ниже приведен код открытия и изменения размера / позиционирования Native OSK.exe. Он размещает клавиатуру относительно положения мыши.
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
public static implicit operator Point(POINT point)
{
return new Point(point.X, point.Y);
}
}
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);
public static Point GetCursorPosition()
{
POINT lpPoint;
GetCursorPos(out lpPoint);
//bool success = User32.GetCursorPos(out lpPoint);
// if (!success)
return lpPoint;
}
private void OSKMenuItem_Click(object sender, RoutedEventArgs e)
{
Process osk = new Process();
osk.StartInfo.FileName = "osk.exe";
osk.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
osk.Start();
Task.Delay(1000).ContinueWith((a) => {
Point p = GetCursorPosition();
try
{
IntPtr target_hwnd = FindWindowByCaption(IntPtr.Zero, "On-Screen Keyboard");
if (target_hwnd == IntPtr.Zero)
{
Microsoft.Windows.Controls.MessageBox.Show("Error");
}
SetWindowPos(target_hwnd, IntPtr.Zero, (int)p.X - 200, (int)p.Y, 1300, 600, 0);
}
catch (Exception ex)
{
//throw;
}
});