【问题标题】:Keep focus on an application专注于应用程序
【发布时间】:2008-09-27 13:30:37
【问题描述】:

我编写了一个具有模态表单的应用程序。如何确保此表单即使在启动其他应用程序时也不会失去焦点?

【问题讨论】:

  • 我假设这是一个 Web 应用程序。对吗?

标签: c# .net vb.net


【解决方案1】:

实际上,这正是你不应该做的事情。

周围有太多的程序假设它们控制着它们所安装的计算机。应该由您的应用程序的用户来控制。

这就是为什么更高版本的 Windows 不允许窃取焦点,而是坚持只闪烁任务列表栏中的条目。

您很可能会找到一种方法来做到这一点(尽管我对此表示怀疑),但我敦促您重新考虑一下。我很想知道你为什么认为这是必要的。

【讨论】:

  • 我写了一个应用程序来收听网络广播电台,而我正在骑自行车测力计。我可以通过按下固定在测力计上的游戏手柄上的按钮来更改站点。当应用程序失去焦点时,我将无法再使用游戏手柄。
  • 我使用的是directX-Framework。当应用程序失去焦点时,我无法再读取数据。
  • 其实我收回我之前的评论:如果它是供您自己使用的软件,那么您有充分的理由保持专注。也许您应该问的一个问题是“我怎样才能阻止其他应用程序窃取我的注意力?”我原以为,当您骑自行车时,不会启动其他应用程序。
  • 有不同的操作,例如我可以用应用程序开始你管视频。一些视频会导致脚本错误,因此浏览器控件显示一个弹出窗口并且主窗体的焦点丢失。
  • 您可以使用 DirectX(我假设您正在使用 DirectInput)从设备中以“混杂”模式读取数据。我写了一个小应用程序,让您可以将游戏手柄用作鼠标,无论哪个应用程序具有焦点。如果这是您想要的,请使用 SetCooperativeLevel 和 CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.Background 作为标志。
【解决方案2】:

您可以将“Topmost”属性设置为 true 以使表单保持在所有其他表单的前面,但这不会使其保持焦点。

【讨论】:

    【解决方案3】:

    您必须使对话系统模态化。

    【讨论】:

    • "您必须使用对话系统模式。"需要重新措辞以更清晰。
    【解决方案4】:

    我用

    SetForegroundWindow(Me.Handle)
    

    Me.Handle 是表单的句柄。

    您需要在类或 winform 中的某处声明以下内容,而不是在函数中

    Declare Unicode Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As IntPtr) As Boolean
    

    您可能需要启动一个计时器并在每 10 秒的滴答声上调用 SetForegroundWindow,具体取决于您的偏好。

    编辑:它适用于我,如果它不添加以下内容

        Declare Unicode Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoW" (ByVal uiAction As Int32, ByVal uiParam As Int32, ByRef pvParam As Int32, ByVal fWinIni As Int32) As Int32
    

    并用这些包围 SetForegroundWindow

        Dim _timeout As Int32
        SystemParametersInfo(&H2000, 0, _timeout, 0)
        SystemParametersInfo(&H2001, 0, 0, 3)
        SetForegroundWindow(Me.Handle)
        SystemParametersInfo(&H2001, 0, _timeout, 2)
    

    这是最后的手段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多