C# 用Windows窗体应用程序替换Windows Shell时第一次按键丢失

C# 用Windows窗体应用程序替换Windows Shell时第一次按键丢失,c#,windows,winforms,C#,Windows,Winforms,我已经按照中给出的方法成功地更换了Windows外壳 然而,我发现第一次按键丢失了,这对用户来说有点麻烦。我们尝试的解决方案是在OnShown事件中激活表单: private void OnShownLoginForm(object z_sender, EventArgs z_e) { Activate(); m_loginTextBox.Focus(); } 但这并没有解决问题。您知道发生了什么吗?您可以尝试使用System.Windows.Forms.SendKeys类()

我已经按照中给出的方法成功地更换了Windows外壳

然而,我发现第一次按键丢失了,这对用户来说有点麻烦。我们尝试的解决方案是在OnShown事件中激活表单:

private void OnShownLoginForm(object z_sender, EventArgs z_e)
{
    Activate();
    m_loginTextBox.Focus();
}

但这并没有解决问题。您知道发生了什么吗?

您可以尝试使用
System.Windows.Forms.SendKeys类
()在表单加载事件中向表单发送按键事件。如果没有帮助,请尝试在表单中发送键盘事件。自表单以来显示的事件。显示的是表单启动过程中的最后一个事件。

听起来可能是另一个控件先获得焦点导致的。文本框是否有taborder,是否可以将其设置为0?然后,在表单加载之后,重点应该放在它上面


否则,请尝试创建一个新表单进行测试,它看起来确实不可复制。

我不知道它是否相关,但我遇到了一个类似的问题,在页面加载时关注第一个输入,直到用户第一次用鼠标单击表单后,按下TAB键,webform的tabindex属性无法工作

我没有访问源代码的权限,所以我尝试用javascript解决它。
在第一次鼠标单击之前,所有键盘笔划(包括TAB键)都会激活按键事件,页面加载时,keydown/keyup未检测到TAB键

我了解到TAB键激活了按键事件,我可以通过它访问按键代码。只需注册keypress事件,然后使用jQuery手动切换到下一个输入即可。 在第一次鼠标单击表单后,该表单的行为符合预期,按键事件不再捕获TAB键

下面是一个代码示例:

function tabNext(e){
    if(e.keyCode == 9){
        // do work
    }
}

$('input').keypress(tabNext);

表单或文本框上是否有任何类型的keypress keydown事件处理程序?这个问题是否只是第一次出现,你如何重现(点击表单,然后点击文本框,它是否有效)?重现并不容易,因为唯一丢失的按键是第一次。情况如下:在系统启动结束时,显示应用程序,请求登录。然后,当用户试图写入他们的凭据时,第一次按键将不会写入任何内容。其余的都能正常工作。我的回答有什么好处吗?请将问题标记为已回答或回答。如果我的建议不起作用,我还有一些其他想法可能会起作用。难道你看不出父窗体上的PreviewKeyPress事件是否可以检测到输入吗?创建一个空闲处理程序来转储聚焦控件怎么样?我很确定文本框最初没有焦点,只有在第一次按键后,焦点设置正确。因此,在OnShow事件中聚焦文本框可能会有所不同。你是说从一个应用程序到另一个应用程序?正确,但我会专门将其发送到表单上的控件。(例如,用户可以输入其ID的文本框。)