1using System.ComponentModel;
2using System.Diagnostics;
3using System.Reflection;
4using System.Runtime.InteropServices;
6using System.Windows.Controls;
7using System.Windows.Data;
8using System.Windows.Input;
9using System.Windows.Media;
11using Dreamine.UI.Abstractions.VirtualKeyboard;
53 InitializeComponent();
118 VirtualKeyboardComp.FocusVkbTextBox();
155 var isVisible = (bool)e.NewValue;
159 VirtualKeyboardComp.ReleasePressedKeys();
160 VirtualKeyboardComp.RemoveNumericHandler();
208 if (Mouse.LeftButton == MouseButtonState.Pressed)
247 catch (Exception ex) { Debug.WriteLine($
"[VK] KeyUp error: {ex.Message}"); }
286 case System.Windows.Input.Key.Enter:
297 await Task.Delay(100);
298 if (IsVisible) Hide();
300 case System.Windows.Input.Key.Escape:
303 await Task.Delay(100);
304 if (IsVisible) Hide();
332 foreach (var provider
in providers)
334 var result = await provider.ExecuteAsync();
335 result.Show(VirtualKeyboardComp.MsgTbl);
336 if (!result.IsAccepted())
378 VirtualKeyboardComp?.Dispose();
408 VirtualKeyboardComp?.Dispose();
433 Point ptDev = ui.PointToScreen(
new Point(0, 0));
435 var ps = PresentationSource.FromVisual(ui);
436 Matrix fromDevice = ps?.CompositionTarget?.TransformFromDevice ?? Matrix.Identity;
438 Point ptDip = fromDevice.Transform(ptDev);
444 Point waTopLeftDip = fromDevice.Transform(
new Point(waR.left, waR.top));
445 Point waBottomRightDip = fromDevice.Transform(
new Point(waR.right, waR.bottom));
446 var waDip =
new Rect(waTopLeftDip, waBottomRightDip);
448 double windowHeight = ActualHeight;
449 double windowWidth = ActualWidth;
450 if (windowHeight <= 0 || windowWidth <= 0)
return;
453 if (ptDip.Y + ui.RenderSize.Height + windowHeight > waDip.Bottom)
455 desiredTop = Math.Max(ptDip.Y - windowHeight, waDip.Top);
459 desiredTop = ptDip.Y + ui.RenderSize.Height;
462 double desiredLeft = Math.Min(Math.Max(ptDip.X, waDip.Left), waDip.Right - windowWidth);
489 VirtualKeyboardComp.Layout = layout;
516 MaxWidth = layout == VkLayout.Text || layout == VkLayout.Password ? 948 : 548;
537 if (layout == VkLayout.Decimal)
539 VirtualKeyboardComp.Minimum = decimal.MinValue;
540 VirtualKeyboardComp.Maximum = decimal.MaxValue;
544 VirtualKeyboardComp.Minimum =
int.MinValue;
545 VirtualKeyboardComp.Maximum =
int.MaxValue;
589 public void SetBinding(System.Windows.Data.Binding binding, decimal min = decimal.MinValue, decimal max = decimal.MaxValue,
string decimalFormat =
"")
591 if (binding ==
null)
return;
594 VirtualKeyboardComp.VkbPasswordBox.Password = passwordBox.Password;
599 VirtualKeyboardComp.Minimum = min;
600 VirtualKeyboardComp.Maximum = max;
601 VirtualKeyboardComp.DecimalFormat = decimalFormat;
605 VirtualKeyboardComp.AddOrRemoveNumericHandler();
632 VirtualKeyboardComp.VkbPasswordBox.Visibility = Visibility.Visible;
633 VirtualKeyboardComp.VkbTextBox.Visibility = Visibility.Collapsed;
637 VirtualKeyboardComp.VkbPasswordBox.Visibility = Visibility.Collapsed;
638 VirtualKeyboardComp.VkbTextBox.Visibility = Visibility.Visible;
753 if (VirtualKeyboardComp.VkbPasswordBox.Password !=
string.Empty)
757 if (sink is PasswordBox childPwd)
759 childPwd.Password = VirtualKeyboardComp.VkbPasswordBox.Password;
769 VirtualKeyboardComp.UpdateSourceBinding();
810 if (root.FindFirstVisualChild<PasswordBox>() is { } pwdBox)
867 var t = target.GetType();
868 var p = t.GetProperty(
870 BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy
872 return p !=
null && p.CanRead && p.CanWrite && p.PropertyType == typeof(
string);
917 var t = target.GetType();
918 var p = t.GetProperty(
920 BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy
923 if (p !=
null && p.CanWrite && p.PropertyType == typeof(
string))
925 p.SetValue(target, value);
965 int count = VisualTreeHelper.GetChildrenCount(root);
966 for (
int i = 0; i < count; i++)
968 var child = VisualTreeHelper.GetChild(root, i);
990 VirtualKeyboardComp.UpdateNumericLabelVisibility();
1003 VirtualKeyboardComp.VkbPasswordBox.Password =
string.Empty;
1004 VirtualKeyboardComp.MsgTbl.Text =
string.Empty;
1017 if (
_placementTarget?.FindFirstVisualChild<System.Windows.Controls.TextBox>() is { } textBox)
1020 textBox.CaretIndex = textBox.Text.Length;
1024 passwordBox.Focus();
1056 [StructLayout(LayoutKind.Sequential)]
1087 [StructLayout(LayoutKind.Sequential)]
1136 [StructLayout(LayoutKind.Sequential)]
1209 [DllImport(
"user32.dll")]
1244 [DllImport(
"user32.dll")]
1245 [
return: MarshalAs(UnmanagedType.Bool)]
static void ResetDreamineVirtualKeyboard()
static void ShowDreamineVirtualKeyboard(DependencyObject? placementTarget)
static List< IEnterActionProvider > GetEnterActionProviders(DependencyObject d)
static bool TargetChanged(DependencyObject? placementTarget)
static void SetVkbIconVisibility(DependencyObject? placementTarget, bool visible)
static readonly DependencyProperty ValueProperty
DependencyObject? _placementTarget
void UpdateSourceBinding()
void FocusPlacementTarget()
static bool TryWritePassword(DependencyObject target, string value)
async void DreamineVirtualKeyboardWindow_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
void SetDisplayKeyboardSize(VkLayout layout)
void DreamineVirtualKeyboardWindow_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
static ? FrameworkElement FindDescendantWithPasswordProperty(DependencyObject root)
DreamineVirtualKeyboardWindow()
void SetDefaultMinMaxValue(VkLayout layout)
static bool HasPasswordProperty(DependencyObject target)
void OwnerWindow_Closing(object? sender, CancelEventArgs e)
void DreamineVirtualKeyboardWindow_MouseDown(object sender, MouseButtonEventArgs e)
void DreamineVirtualKeyboardWindow_Closing(object? sender, CancelEventArgs e)
async Task< bool > InvokeProvdersAsync()
void SetWindowOwner(Window? owner)
void SetBinding(System.Windows.Data.Binding binding, decimal min=decimal.MinValue, decimal max=decimal.MaxValue, string decimalFormat="")
static bool TryFindPasswordLikeElement(DependencyObject root, out FrameworkElement element)
void DreamineVirtualKeyboardWindow_SizeChanged(object sender, SizeChangedEventArgs e)
void Application_Exit(object sender, ExitEventArgs e)
void UpdateVisibilityState()
void SetPlacementTarget(DependencyObject? placementTarget)
void CalcKeyboardPosition()
void DreamineVirtualKeyboardWindow_LocationChanged(object? sender, EventArgs e)
async Task HandleKeyUpAsync(System.Windows.Input.KeyEventArgs e)
void SetLayout(VkLayout layout)
static bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi)
static IntPtr MonitorFromPoint(POINT pt, uint dwFlags)
const uint MONITOR_DEFAULTTONEAREST
static void ShiftWindowOntoScreen(Window window, Rect waDip)