C# 运行全屏应用程序时,将Windows任务栏置于前面

C# 运行全屏应用程序时,将Windows任务栏置于前面,c#,winapi,C#,Winapi,我有一个应用程序,我用一个notify图标来显示一些气球提示。但是,它将在一个环境中运行,在这个环境中,始终有一个单独的主应用程序以全屏模式运行。我的问题是让任务栏出现在前面-我以为当系统托盘中的Notify图标上出现气球提示时,任务栏会自动出现 我可以使任务栏在全屏模式下运行的应用程序上可见吗 我已经尝试了以下方法,但这不是隐藏或取消隐藏任务栏的情况,而是将任务栏放在最前面或使运行中的应用程序不是全屏的情况 int TaskBarHwnd = FindWindow("Shell_traywnd

我有一个应用程序,我用一个notify图标来显示一些气球提示。但是,它将在一个环境中运行,在这个环境中,始终有一个单独的主应用程序以全屏模式运行。我的问题是让任务栏出现在前面-我以为当系统托盘中的Notify图标上出现气球提示时,任务栏会自动出现

我可以使任务栏在全屏模式下运行的应用程序上可见吗

我已经尝试了以下方法,但这不是隐藏或取消隐藏任务栏的情况,而是将任务栏放在最前面或使运行中的应用程序不是全屏的情况

int TaskBarHwnd = FindWindow("Shell_traywnd", "");
bool result1 = SetWindowPos(TaskBarHwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW);   // Hide Taskbar
bool result1 = SetWindowPos(TaskBarHwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW); // Show Taskbar
编辑 一定有办法做到这一点-如果我正在看电影,我的电池电量不足,然后任务栏向上滑动,我会收到关于电池的通知。我需要找出操作系统是如何实现这种行为的

编辑
值得一提的是,全屏应用程序的源代码在我们的控制之下。公平地说,这确实改变了这个问题,但我仍然想知道一种“中断”全屏应用程序的方法,不管您是否拥有控制权。

从纯技术角度来看,这是一个非常有趣的问题。首先想到的不是一个优雅的解决方案,而是一个可行的解决方案——打开“开始”菜单:

SendMessage(hAnyWnd, WM_SYSCOMMAND, SC_TASKLIST, 0)
我会看看是否能找到另一个解决办法


(当然,最明显的解决方案是
带来indowtop(hTaskBar)
,但这似乎不起作用。)

我现在考虑的一种方法是从我的notifyicon应用程序发送escape键

SendKeys.Send("{ESC}");

这是因为全屏应用程序的标准行为通常是在键盘上点击escape时退出全屏模式。我仍然不认为这是最好的解决方案,因为如果用户正在做其他事情,强制ESC可能会有副作用……但这很可能“足够好”

另一种解决方案呢


不使主应用程序全屏:它将覆盖除默认情况下任务栏始终位于的区域之外的整个屏幕视图。如果任务栏被重新定位到另一侧,操作系统将通知应用程序刷新其窗口大小,但它将始终避开新的任务栏区域。最坏的情况是任务栏设置为自动隐藏。不过,它看起来不会那么漂亮。

如果没有问题,开始菜单将弹出,您可以按下windows按钮

keybd_event(VK_LWIN, 0, 0, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

在Windows 7下对我来说效果很好。

通知不应该在全屏应用程序上显示-我不希望它们打断我的演示或我的电影。感谢您的回复,Michael,但不要告诉我您在观看电影等时的偏好。您能回答提出的问题吗?如果你再看一遍这个问题,我不是问是否应该这样做,而是问是否可以这样做。谢谢。对不起,我有点太狡猾了。通知不应该在全屏应用程序上显示,系统确实会主动尝试阻止此类行为,这就是为什么您会遇到问题。好吧,这很公平,也很有意义——一个好的操作系统应该阻止此类行为,为解决这一问题而欢呼。在本例中,全屏应用程序运行在专有手持设备上,其唯一目的是运行该应用程序。然而,当有可用的更新时,第二个应用程序应该会显示通知-这些更新在全屏后消失了…我现在想(在阅读了大量相关内容后),自定义控件(如半透明winform)将是一个更好的解决方案…在我的情况下,该应用程序需要全屏,以获得尽可能多的屏幕房地产-这是不可谈判的!如何将Windows任务栏的属性设置为始终位于前面(通过右键单击任务栏的属性并将其设置在其他Windows选项的顶部)?它将始终使系统托盘图标中的任何通知气球也出现在前面。在我的情况下,任务栏总是被锁定的,并且不是自动隐藏的。在全屏模式下运行的应用程序仍然会出现在包括任务栏在内的所有其他窗口上,因此尽管通知仍然会发生,但它们不会被看到。这是一个可行的解决方案。好吧,但我选择发送ESC键。这是预期的行为-全屏应用程序通过退出全屏模式响应ESC键。