Платформа = C #, Visual Studio 2013
У меня есть PasswordBox
в окне WPF, которое принимает данные из OnScreenKeyboard.Ниже приведены требования, которые мой код выполняет без каких-либо проблем:
1: Когда пользователь щелкает мышью внутри PasswordBox
, должна появиться OnScreenKeyboard.
2 : когда пользователь щелкает мышью за пределами PasswordBox
, OnScreenKeyboard должен исчезнуть.
Проблема: Всякий раз, когда я нажимаю " снаружи " PasswordBox
(т. Е. Window) изатем нажмите « внутри » PasswordBox
, я не могу набрать что-либо из OnScreenKeyboard, даже если курсор мигает внутри PasswordBox
.
Однако, когда окно загружено и я «первый» нажмите« внутри » PasswordBox
(т. Е. Window), он успешно принимает данные из OnScreenKeyboard.
Требование: Всякий раз, когда я нажимаю внутри PasswordBox
, он должен принимать вводс OnScreenKeyBoard независимо от погоды, я сначала нажимаю на Окно или в сторону PasswordBox
.
XML-код:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" FocusManager.FocusedElement="{Binding ElementName=p1}" Height="740" Width="1840" MouseLeftButtonDown="Window_MouseLeftButtonDown" Loaded="Window_Loaded" Margin="0,0,0,0" >
<Grid x:Name="g1" >
<PasswordBox x:Name="p1" HorizontalAlignment="Left" Margin="900,600,0,0" VerticalAlignment="Top" Width="110" Height="32" RenderTransformOrigin="-0.433,0.645" PreviewMouseLeftButtonDown="p1_PreviewMouseLeftButtonDown" />
</Grid>
</Window>
C # Исходный код:
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
[DllImport("user32.dll")]
static extern bool ShowWindow2(IntPtr hWnd, int nCmdShow);
[DllImportAttribute("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImportAttribute("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImportAttribute("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ShowOnScreenKeyBoard();
Thread.Sleep(1000);
HideOnScreenKeyBoard();
}
private void ShowOnScreenKeyBoard()
{
bool isVisible = false;
PreviewMouseLeftButtonDown += (ss, ee) =>
{
if (!p1.IsMouseOver && isVisible)
{
Process[] Processes = Process.GetProcessesByName("CCOnScreenKeyboard");
}
else if (!isVisible)
{
System.Diagnostics.Process.Start("D:\\CCOnScreenKeyboard.exe");
isVisible = true;
}
};
try
{
Process[] Processes = Process.GetProcessesByName("CCOnScreenKeyboard");
foreach (Process p2 in Processes)
{
ShowToFront(p2.MainWindowTitle);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void HideOnScreenKeyBoard()
{
try
{
Process p = Process.GetProcesses().Where(d => d.ProcessName.Contains("CCOnScreenKeyboard")).DefaultIfEmpty(null).FirstOrDefault();
IntPtr hWndOSK = p.MainWindowHandle;
ShowWindow(hWndOSK, 2);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void p1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ShowOnScreenKeyBoard();
}
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
HideOnScreenKeyBoard();
}
public static void ShowToFront(string windowName)
{
try
{
IntPtr firstInstance = FindWindow(null, windowName);
ShowWindow(firstInstance, 1);
SetForegroundWindow(firstInstance);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}