C # PasswordBox не принимает данные от OnScreenKeyborad - PullRequest
0 голосов
/ 04 мая 2019

Платформа = 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);
            }

        }


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...