我确切地知道您在说什么,问题实际上在于您的应用程序的设计与 Windows 处理焦点的方式不一致。自 win31 以来,Windows 一直在做这种事情。这就像一场土地掠夺;如果你从你的应用程序中显示一个窗口,然后隐藏/禁用它,你会打盹,根据比尔,你输了。修复:你需要一个主窗口!或切换操作系统。仅仅因为它可以在 EXE 中运行并不意味着当您的一个用户从批处理文件或资源管理器之外的其他文件中启动它时它会起作用。
您可以解决这个问题 - 运行 3 个单独的 exe;尝试在您的子 Main 中运行 3 个 Application.Run 线程;使用 SetTopMost,AppActivate 自己。
或者查看如何使用 SDK 调用使您的应用程序获取输入焦点 - 连续版本的 windows 已经变得困难,以减轻使用它的令人讨厌的应用程序(因此可以在 w98 中执行此操作的应用程序将在 xp 中将任务栏闪烁橙色) - 然后程序员当然已经解决了这个问题。你可以这样做。
但是你做错了。重构是有序的,并且会改变未来应用程序的策略。这不是我做出的决定;windows 的工作方式是一成不变的,而用户期望它的工作方式是由数百万个大脑决定的,这比石头还难——顺其自然!
没有实际影响的简单重构:
- 备份您的项目(或搁置 TFS 中的副本)
- 在您的选项对话框中,剪切所有控件。放入一个名为 pnlOpts 的表单大小的面板。将它们粘贴回去。
- 使该表格成为您的主要表格。
- 在 form_shown 中,设置 pnlOpts.Visible=false,或者只是默认设置(如果你想有点垃圾,你可以显示另一个带有应用程序名称或背景图像的面板;-)
- 调用也显示该区域的文件 dlg 的设置代码
- 将您的文件 dlg 设置为将该表单作为父级,将启动位置设置为中心父级(我的意思是所有者而不是父级)。记住从此取消=关闭设置表单
- 完成后,显示 pnlOpts。
- 在 OK 按钮中,调用执行进度条的代码。您可以再次在此处隐藏或禁用 pnlOpts。
- 您在任何时候都不能在整个窗口上隐藏、设置 Visible=false 或 enabled=false,否则您将引发窗口的聚焦愤怒(这是您在这里痛苦的原因)。
这里真正的关键是单行答案:让主窗口始终可见并启用,如果您想禁用其功能,只需灰色或隐藏其所有控件。这是最简单的面板。如果需要,您可以向用户显示其他面板或图像以娱乐他们(特别是如果将 [.enabled=false] 内容变灰没有意义)。
你不会喜欢那样的外观,或者你一开始就会这样构建它,但是数百万行 Windows 代码和数百万 Windows 用户的大脑现在正在被动地积极反对你!