ShowWindow API在Windows 7中失败

时间:2011-11-16 13:09:52

标签: c# winapi windows-7

对于两周,自从我安装Windows 7以来的每一天,我一直在努力让自己有所作为。在XP中完全正常的东西。它让我发疯,毒害了我的生命,毁了我的日子。为什么这么简单的任务真的很有效!?

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

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

http://www.axonnsd.org/W/P007/BugsDemo.rar

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

HideableApplicationRevealer尝试显示HideableApplication的窗口。

我需要完成此任务的原因是因为我将Total Commander和FireFox最小化到托盘,我想通过HotKey将它们带回来。 Total Commander提供了这样的功能,但它已被破坏。

在Windows XP上,我设法使用我附带的代码完成了这两项任务。

在Windows 7上,行为充其量是不稳定的,在最坏的情况下是无效的。

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

  • 尝试通过Visual Studio中的HideableApplicationRevealer显示它=> SUCCESS
  • 尝试通过手动执行Debug文件夹中的HidebleApplicationRevealer.exe来显示它=> SUCCESS
  • 尝试通过键盘快捷键=>运行HideableApplicationRevealer.exe来显示它。 SUCCESS
  • 尝试通过带有Admin Rights =>的计划任务运行HIdeableApplicationRevealer.exe来显示它。 SUCCESS。

当手动执行HideableApplication时(通过Debug文件夹中的.exe)和Visual Studio IS STARTED,如果我使用管理员权限或手动运行它,它会起作用:

  • 尝试通过Visual Studio中的HideableApplicationRevealer显示它=> FAIL
  • 尝试通过手动执行Debug文件夹中的HidebleApplicationRevealer.exe来显示它=> SUCCESS
  • 尝试通过键盘快捷键=>运行HideableApplicationRevealer.exe来显示它。 FAIL
  • 尝试通过带有Admin Rights =>的计划任务运行HIdeableApplicationRevealer.exe来显示它。 SUCCESS。
  • 尝试通过键盘快捷键(开始菜单)运行HideableApplicationRevealer.exe来显示它,该快捷键已被赋予ADMIN RIGHTS => SUCCESS。

当手动执行HideableApplication时(通过Debug文件夹中的.exe)和Visual Studio已经关闭:它只有在我手动运行它时才会起作用(双击exe):

  • 尝试通过手动执行Debug文件夹中的HidebleApplicationRevealer.exe来显示它=> SUCCESS
  • 尝试通过键盘快捷键=>运行HideableApplicationRevealer.exe来显示它。 FAIL
  • 尝试通过带有Admin Rights =>的计划任务运行HIdeableApplicationRevealer.exe来显示它。问题:窗口在TaskBar上闪烁而不是显示!
  • 尝试通过键盘快捷键(开始菜单)运行HideableApplicationRevealer.exe来显示它,该快捷键已被赋予ADMIN RIGHTS => SUCCESS。

如果重要的话,我在任务栏的标准位置和屏幕左侧的AutoHide中都重现了这种行为。

显然,我需要管理员权限才能显示一个窗口,但即使这样,当我使用“计划任务”变通方法时,它也无法正常工作(使用管理员权限创建计划任务并通过system32 / schtasks调用计划任务.exe / run / tn"任务名称")。发生的事情是,当视觉工作室关闭后,窗口会在TaskBar上闪烁而不是显示(并且没有焦点)。它确实出现了,但它没有键盘焦点,这不应该发生,因为我也使用了SetForegroundWindow API。

这正是当我尝试运行显示Total Commander时发生的事情:阅读下面,相同的行为:在任务栏上闪烁而不是显示。

甚至没有让我开始了解从Visual Studio运行它和从通常的C:\ MyProjects文件夹运行它之间的行为差​​异。

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

FireFoxRevealer不是透露FireFox,而是做了一件非常奇怪的事情:它在屏幕的左上角显示一个小标签,通常与打开的标签有关。我怀疑这与Window Style和ShowWindow函数在Windows 7中的工作方式有关。但是,有时它可以工作,显示实际窗口。但大多数时候它并没有。当它停止工作时,我永远不会让它再次工作,直到某些未知的情况发生并再次起作用。无论如何,这在Windows XP下完全有效,现在根本不起作用。

如果您希望重现FireFox问题,请使用我附带的代码:而不是搜索"可隐藏的应用程序" FindWindow API中的文本,搜索" MozillaWindowClass",安装FireFox 7或8并安装FireFox"最小化托盘复活"插件。

我还应该提到我已经意识到" ForegroundLockTimeout"注册表设置,我已将其设置为0,它出现在注册表中。在Windows XP上,它默认设置为0,但在Windows 7中,默认值为200000,我已更改。也许某种程度上它在某处徘徊? Visual Studio在运行时,在关闭它时将其设置为200000,直到我重新启动计算机?我查看了注册表,它没有改变,它仍然是0.但谁知道呢?

0 个答案:

没有答案