专注于应用程序

时间:2020-03-06 14:49:27  来源:igfitidea点击:

我已经编写了一个具有模式形式的应用程序。如何确保即使启动其他应用程序,该表单也不会失去焦点?

解决方案

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

周围有太多程序假定它们可以控制所安装的计算机。应该控制应用程序的用户。

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

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

我们可以将" Topmost"属性设置为true,以使表单保持在所有其他表单的前面,但这并不能使表单保持焦点。

我们必须使对话框系统成为模态。

我用

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)

那是最后的手段