1

我们已经实施了一个解决方案,给我们的内部用户一个他们需要重新部署我们的应用程序的唠叨消息。我们正在使用文件系统观察程序来监视网络并寻找运行良好的特定文件中的更改。大多数功能都在一个基表单类中实现,我们的应用程序的大多数表单都继承自该基表单类。在重新部署应用程序之前,将每五分钟显示一个新消息框。它让他们感到厌烦,以至于它可以有效地让他们重新部署,但让他们在需要时完成他们所做的任何事情。

如果用户离开他们的办公桌,当他们返回时可能会有 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 的句柄。

4

2 回答 2

2

为什么不只使用一个命名的EventWaitHandle来指示当前是否显示这些消息框之一?您的所有应用程序都可以订阅该事件。当应用程序看到该显示消息框时,它会检查是否设置了等待句柄。如果未设置,则应用程序设置事件并显示消息框。当消息框被关闭时,应用程序会重置事件。如果在选中时设置了事件则应用程序不会显示该消息。

这比FindWindowand容易多了EnumWindows

于 2012-11-27T22:06:41.403 回答
1

获得HWND窗口句柄后,您可以使用GetWindowLong(GWL_HINSTANCE)GetWindowThreadProcessId()检查窗口属于哪个应用程序实例。用于EnumWindows()枚举所有顶级窗口,您的回调函数在其中检查每个报告窗口的标题和进程实例,直到找到您要查找的匹配项。

于 2012-11-27T21:56:30.097 回答