【问题标题】:Winforms no focus accept keyboard inputWinforms无焦点接受键盘输入
【发布时间】:2016-05-07 05:04:22
【问题描述】:

这就是我想要实现的目标。我有一个简单的聊天 winforms 应用程序,我想将它放在其他全屏应用程序之上,我不希望它获得焦点,但我希望它接受文本框中的用户输入。到目前为止,我已经完成了第一部分,并且我的聊天应用程序保持在其他应用程序之上,而没有集中注意力。这是我用过的:

const int WS_EX_NOACTIVATE = 0x8000000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams ret = base.CreateParams;
        ret.ExStyle |= WS_EX_NOACTIVATE;
        return ret;
    }
}


public Form1()
{
    InitializeComponent();
    TopMost = true;
}

现在的问题是我无法在文本框中写入任何内容。所有按钮都可以正常工作,我可以单击它们并触发事件,但文本框不接受任何输入。

【问题讨论】:

  • 尝试添加标志 0x00000080,即 WS_EX_TOOLWINDOW
  • 仍然不接受任何输入
  • 我会说你需要激活窗口的焦点。如果没有文本框焦点,你怎么能写文本?
  • 这就是我在这里问的原因。我希望有某种 c# 魔法可以让我做到这一点,特别是因为我可以正常点击按钮。

标签: c# .net winforms topmost


【解决方案1】:

在您的 Form 类中覆盖此参数并从您的代码中删除 TopMost = true;。这将起作用并在尝试编辑文本框时获得焦点。

protected override bool ShowWithoutActivation
{
    get { return true; }
}

private const int WS_EX_TOPMOST = 0x00000008;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= WS_EX_TOPMOST;
        return createParams;
    }
}

在这里找到它:Look at second answer

【讨论】:

  • 顺便说一句,我测试了它,它对我有用。表单在特定时间触发并且似乎没有获得焦点。即使出现这种情况,我也可以在其他应用程序中继续书写和移动箭头。
  • 问题是我正在使用 WS_EX_NOACTIVE 以便我的应用程序保持在全屏的顶部,但当我单击它时,Windows 任务栏也不会出现。我想我要么有聊天和任务栏,要么没有。
  • 我认为在全屏应用程序上设置顶部是没有意义的。它旨在成为一个全屏应用程序,以避免出现其他内容,即使 Steam 也会避免它,除非您在播放全屏视频时使用 Shift+Tab 或浏览器/媒体播放器调用 Steam 窗口(为什么要在视频上设置一个窗口?) Windows 8.X 和 10 会执行此操作,如果您在非 DiretcX/OpenGL 应用程序中全屏显示并且很烦人,它们甚至会发送 Windows 通知!作为 Windows 的用户,我不希望 Windows 每次都在最上面,即使是全屏 D:jajaja
  • 它应该是一个聊天应用程序,所以在玩游戏时你可以在某个地方显示一个小窗口,你可以在那里交谈。此外,计划是使用复选框来执行最顶部的可选操作以更改状态。我只是不想在应用获得焦点时显示 Windows 任务栏,但我想一切都是有代价的。
猜你喜欢
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多