专注于应用程序
时间: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)
那是最后的手段