C# ShowWindow API在Windows 7中失败

C# ShowWindow API在Windows 7中失败,c#,winapi,windows-7,C#,Winapi,Windows 7,两个星期以来,自从我安装Windows7以来,每天我都在努力工作。在XP中工作正常的东西。它让我发疯,毒害我的生活,毁了我的日子。为什么这么简单的任务如此混乱 我想我在Windows7中发现了一个bug,特别是在标准主题(Aero)中ShowWindow函数的工作方式 为了演示这一点,我上传了2个C#WinForms应用程序及其源代码 HideableApplication表示一个应用程序,当您关闭它时,可以将其隐藏在SysTray中。双击SysTray图标将显示该图标,右键单击将显示“退出”

两个星期以来,自从我安装Windows7以来,每天我都在努力工作。在XP中工作正常的东西。它让我发疯,毒害我的生活,毁了我的日子。为什么这么简单的任务如此混乱

我想我在Windows7中发现了一个bug,特别是在标准主题(Aero)中ShowWindow函数的工作方式

为了演示这一点,我上传了2个C#WinForms应用程序及其源代码

HideableApplication表示一个应用程序,当您关闭它时,可以将其隐藏在SysTray中。双击SysTray图标将显示该图标,右键单击将显示“退出”选项

HideableApplicationRevealer尝试显示HideableApplication的窗口

我之所以需要完成这项任务,是因为我将我的Total Commander和FireFox最小化到托盘中,并希望通过热键将它们带回来。Total Commander提供了这样一个功能,但它已被破坏

在WindowsXP上,我使用附带的代码成功地完成了这两项任务,没有任何问题

在Windows7上,这种行为最好是不稳定的,最坏是不起作用的

当HideableApplication在Visual Studio中运行时,一切正常:

  • 试图通过VisualStudio=>SUCCESS中的HideableApplicationRevealer显示它
  • 试图通过手动执行调试文件夹中的HidebLeapApplicationRevealer.exe来显示它=>SUCCESS
  • 通过键盘快捷键运行HideableApplicationRevealer.exe尝试显示它=>成功
  • 尝试通过使用管理员权限=>成功的计划任务运行HIdeableApplicationRevealer.exe来显示它
手动执行HideableApplication(通过调试文件夹中的.exe)并启动Visual Studio时,如果我使用管理员权限或手动运行它,则它会工作:

  • 试图通过Visual Studio中的HideableApplicationRevealer=>显示失败
  • 试图通过手动执行调试文件夹中的HidebLeapApplicationRevealer.exe来显示它=>SUCCESS
  • 通过键盘快捷键运行HideableApplicationRevealer.exe试图显示它=>失败
  • 尝试通过使用管理员权限=>成功的计划任务运行HIdeableApplicationRevealer.exe来显示它
  • 通过键盘快捷键(开始菜单)运行HideableApplicationRevealer.exe(已授予管理员权限=>SUCCESS)尝试显示它
当手动执行HideableApplication(通过调试文件夹中的.exe)并关闭Visual Studio时:仅当手动运行HideableApplication(双击exe)时,它才起作用:

  • 试图通过手动执行调试文件夹中的HidebLeapApplicationRevealer.exe来显示它=>SUCCESS
  • 通过键盘快捷键运行HideableApplicationRevealer.exe试图显示它=>失败
  • 试图通过使用管理员权限=>的计划任务运行HIdeableApplicationRevealer.exe来显示它问题:任务栏上的窗口会闪烁而不是显示
  • 通过键盘快捷键(开始菜单)运行HideableApplicationRevealer.exe(已授予管理员权限=>SUCCESS)尝试显示它
如果有关系的话,我在任务栏处于标准位置的情况下以及在屏幕左侧将其设置为“自动隐藏”的情况下再现了这种行为

显然,我需要管理员权限来显示窗口,但即使如此,当我使用计划任务解决方案(创建具有管理员权限的计划任务并通过system32/schtasks.exe/run/tn“Task name”调用计划任务)时,它也无法正常工作。在VisualStudio关闭后,窗口会在任务栏上闪烁,而不是显示(并且没有焦点)。它确实出现了,但没有键盘焦点,这不应该发生,因为我还使用了setForeGroundIndow API

这正是我尝试运行“显示总指挥”时发生的情况:阅读下面的内容,相同的行为:在任务栏上闪烁,而不是显示

甚至不要让我开始了解从VisualStudio运行它和从通常的C:\MyProjects文件夹运行它之间的行为差异

我的TotalCommanderRevealer和FireFoxRevealer表现出更奇怪的行为:启动Visual Studio时,TotalCommander应用程序停止正常工作。即使我没有加载任何项目,它也只是在任务栏上闪烁,而不是向我显示TC。但是,如果我打开TCRevealer项目,它将再次开始工作!如果我关闭Visual Studio,它将停止工作,直到我重新启动WINDOWS

FireFoxRevealer没有显示FireFox,而是做了一些非常奇怪的事情:它在屏幕的左上角显示了一个小标签,通常与打开的标签相关。我怀疑这与Windows 7中的窗口样式和ShowWindow功能的工作方式有关。但是,有时它会工作,显示实际的窗口。但大多数情况下,情况并非如此。当它停止工作时,我永远不会让它再次工作,直到某些未知的情况发生,它再次工作。不管怎样,这在WindowsXP下运行得很好,现在根本不起作用

如果您希望重现FireFox问题,请使用我随附的代码:不要在FindwindowAPI中搜索“可隐藏的应用程序”文本,而是搜索“MozillaWindowClass”,安装FireFox 7或8并安装FireFox“最小化到托盘恢复”插件


我还应该提到,我知道“ForegroundLockTimeout”注册表设置,并且在注册表中出现的任何地方都将其设置为0。在Windows XP上,它默认设置为0,但在Windows 7中,默认值为200000,我已经更改了。也许它会在某处徘徊???Visual Studio在运行时,在我关闭它时将其设置为200000,直到我重新启动计算机?我查看了注册表,它没有改变,仍然是0。但谁知道呢?

不太可能是个bug。可能是故意的。Vista简介