1

我不想在这个问题上花费更多时间,但如果您有兴趣阅读它并知道答案,请回复。提前致谢。

我有一个 Windows 窗体应用程序,它以最小化模式启动另一个 Windows 窗体应用程序,并将 ShowInTaskbar 设置为 False。第一个应用程序有一个显示按钮,该按钮使用以下方法显示另一个应用程序。

        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        SetForegroundWindow(WindowHandle)

我在第二个应用程序中使用激活事件在激活时刷新其表单。问题是,在激活表单时,activate 事件通常不会触发。显示隐藏表单并激活,但未调用激活事件处理程序。第一个应用程序是一个 MDI 应用程序,但我不明白这会是一个因素。

第二个表单上有一个按钮可以隐藏它。此按钮仅调用表单的 Hide 方法,不会最小化表单。下次在第一个应用程序上按下 Show 按钮时,将为第二个应用程序触发 activate 事件。将第二个应用程序的 ShowInTask 栏设置为 True 没有帮助。最小化而不是隐藏窗口不会阻止在第二次激活应用程序时触发 Activate 事件。

4

3 回答 3

0

我怀疑这是因为激活事件是针对可见 Windows 的。从 MSDN 文档(我的重点):

如果这是活动应用程序,则激活表单会将其置于最前面,如果这不是活动应用程序,则它会闪烁窗口标题。表单必须可见,此方法才能生效。若要确定应用程序中的活动窗体,请使用 ActiveForm 属性或 ActiveMdiChild 属性(如果您的窗体位于多文档界面 (MDI) 应用程序中)。

作为替代方案,第一个应用程序可以向第二个应用程序发送一个组合键来触发内容刷新。

于 2012-08-28T16:42:54.607 回答
0

我仍然不确定是什么导致了问题,但我能够通过使用以下代码并切换到 VisibleChanged 事件而不是表单激活事件来解决它。

        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        ShowWindow(WindowHandle, ShowWindowCommands.Hide)
        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        SetForegroundWindow(WindowHandle)

请注意,对于上面的代码,VisibleChanged 事件仅触发一次。

于 2012-08-28T19:14:32.970 回答
0

好的,我放弃试图弄清楚为什么窗体的 Activated 事件处理程序在第一次显示并激活最小化、隐藏的窗口时不能可靠地触发。我尝试了所有我能想到的 ShowWindow 命令组合。我什至尝试引入计时器和睡眠,以防出现时间问题。任何时候显示最小化窗口时,Activated 事件都可能不会可靠地触发,并且它不触发可能与窗口被隐藏的事实无关。我没有测试过这些案例。

以下代码是我每次使用 VisibleChanged 事件而不是 Activate 事件时唯一可以工作的代码。

        If IsIconic(WindowHandle) Then
            ShowWindow(WindowHandle, ShowWindowCommands.Normal)
            ShowWindow(WindowHandle, ShowWindowCommands.Hide)
        End If
        ShowWindow(WindowHandle, ShowWindowCommands.Normal)
        SetForegroundWindow(WindowHandle)
于 2012-08-29T15:13:00.257 回答