我们已经实施了一个解决方案,给我们的内部用户一个他们需要重新部署我们的应用程序的唠叨消息。我们正在使用文件系统观察程序来监视网络并寻找运行良好的特定文件中的更改。大多数功能都在一个基表单类中实现,我们的应用程序的大多数表单都继承自该基表单类。在重新部署应用程序之前,将每五分钟显示一个新消息框。它让他们感到厌烦,以至于它可以有效地让他们重新部署,但让他们在需要时完成他们所做的任何事情。
如果用户离开他们的办公桌,当他们返回时可能会有 20 多个消息框,就会遇到问题。所以我们要做的是弄清楚他们是否已经关闭了消息框。如果他们没有解雇,就没有理由再展示一个。
他们不仅可以运行多个实现此功能的不同应用程序,还可以运行多个相同的应用程序,只是连接到不同的环境。
我用 FindWindow 成功找到了消息框,但我不知道它属于哪个应用程序的哪个特定实例,所以我不能假设它属于当前实例。我希望 FindWindowEx 通过将消息框所有者的句柄传递给 api 调用来工作,但我没有成功。它总是返回零。
我将展示的代码在 vb.net 中,但我精通 c# 和 vb.net,所以解决方案的形式无关紧要。
无论如何,这里是抛出通知的代码:
Private Sub InitDeploymentCheck()
moDeploymentCheck = New TRS.Deployment.TRSDeploymentCheck(EnvironmentVariables.Environment, AppDomain.CurrentDomain.BaseDirectory.Contains("bin"), MDIMain)
AddHandler moDeploymentCheck.DeploymentNeeded,
Sub()
moTimer = New Timer()
moTimer.Interval = 300000 '5 minutes
moTimer.Enabled = True
AddHandler moTimer.Tick,
Sub()
'check to see if the message box exist or not before throwing up a new one
MessageBox.Show(MDIMain, "There is a recent critical deployment, please re-deploy STAR to get latest changes.", "Critical Deployment", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Sub
MessageBox.Show(MDIMain, "There is a recent critical deployment, please re-deploy STAR to get latest changes.", "Critical Deployment", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Sub
我能够找到窗口:
Dim handle As IntPtr = FindWindow(Nothing, "Critical Deployment")
这就是我尝试使用 FindWindowEX 查找窗口的方式:
Dim t As IntPtr = FindWindowEx(200398, IntPtr.Zero, "Form", "Critical Deployment")
200398 是上面 mdimain 的句柄。