我在 winforms 应用程序的用户控件中有一个 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();
}