OSK打开后,Devexpress文本框失去焦点

时间:2017-09-21 11:50:16

标签: c# winforms process devexpress web-operating-system

我在winforms应用程序的usercontrol中有一个devexpress文本框。 问题是,当加载用户控件并且用户点击devexpress文本框时,它反过来调用OSK键盘,从文本框中失去焦点。

用户无法直接在OSK上开始输入。相反,他需要点击文本框再次获得焦点并开始输入。

请建议是否有任何解决方案。

我通过调试找到的是,当我在设置的焦点代码上放置一个断点时,焦点被分配给文本框。但是当我尝试一次性运行它时,它没有设置焦点。

 private void OnMouseClickUserControl(object sender, MouseEventArgs e)
        {
            //  verify if the button is displayed
            if (!this.ShowButton)
            {               
                this.OnEnterUserControl(this, e);               
            }

        }


private void OnEnterUserControl(object sender, EventArgs e)
        {
            //  verify if button is displayed
            if (!this.ShowButton)
            {
                //  set the input scope
                this.SetInputScope();
                //  show the keyboard
                TabTip.OpenTabTip();

                //  focus the helper textbox
                //this.tbxText.Focus();

                this.tbxText.SelectAll();
                this.tbxText.SelectionLength = 0;


            }
        }

 public static bool OpenTabTip()        
        {
            bool result = false;

            //  reset the main window handle 
            TabTip._keyboardMainWindowHandle = IntPtr.Zero;

string osk = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "system32"), "osk.exe");
                string pathX64 = Environment.ExpandEnvironmentVariables("%ProgramW6432%");
                string pathX32 = Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");
                //  in case of 32 bit systems
                if (osk.Contains(pathX32))
                    osk = osk.Replace(pathX32, pathX64);
                //  start the keyboard process
                ProcessStartInfo startInfo = new ProcessStartInfo(osk);                
                Process tmp = System.Diagnostics.Process.Start(startInfo);

                //  wait until starting the process has been finished
                //result = tmp.WaitForInputIdle(5000);
                //  refresh the process information
                tmp.Refresh();
}

0 个答案:

没有答案