C# 如何在显示桌面/最小化所有/最小化所有窗口时通知我的应用程序?

C# 如何在显示桌面/最小化所有/最小化所有窗口时通知我的应用程序?,c#,desktop,C#,Desktop,如何在使用c#显示桌面/最小化所有窗口/最小化所有窗口时通知我的应用程序以下内容可能会帮助您开始。这只是一个标准表单,上面有一个列表框(名为listMessages)。当我执行桌面最小化/显示所有时,表单捕获WM_大小的消息并将消息m值输出到列表框。表单可能不会响应典型的最小化和最大化事件,但它应该从windows消息泵接收这些消息。至于检测是否显示了任何其他窗口,这有点复杂,但也可以做到 using System; using System.Windows.Forms; namespace

如何在使用c#

显示桌面/最小化所有窗口/最小化所有窗口时通知我的应用程序以下内容可能会帮助您开始。这只是一个标准表单,上面有一个列表框(名为listMessages)。当我执行桌面最小化/显示所有时,表单捕获WM_大小的消息并将消息m值输出到列表框。表单可能不会响应典型的最小化和最大化事件,但它应该从windows消息泵接收这些消息。至于检测是否显示了任何其他窗口,这有点复杂,但也可以做到

using System;
using System.Windows.Forms;

namespace MinimizeAll
{
    public partial class Form1 : Form
    {
        private const int WmSize = 5;
        private const int SizeRestored = 0;
        private const int SizeMinimized = 1;
        private const int SizeMaximized = 2;
        private const int SizeShow = 3;
        private const int SizeHide = 4;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
            try
            {
                if (m.Msg == WmSize)
                {
                    var wparam = m.WParam.ToInt32();

                    switch (wparam)
                    {
                        case SizeRestored:
                        case SizeMinimized:
                        case SizeMaximized:
                        case SizeShow:
                        case SizeHide:
                            var output = string.Format("{0}{1:X} {2:X} {3:X} {4:X} {5:X}", prefix, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32(), m.HWnd.ToInt32(), m.Result.ToInt32());
                            listMessages.Items.Add(output);
                            break;
                        default:
                            // this is just a demo (code police)...
                            base.WndProc(ref m);
                            return;
                    }
                }
                else
                {
                    base.WndProc(ref m);
                }
            }
            catch (Exception)
            {
                listMessages.Items.Add("err");
                base.WndProc(ref m);
            }
        }
    }
}

所以。。。为了最小化所有窗口,您可以使用以下选项:

将“MicrosoftShell控件和自动化”COM参考添加到项目中(参考=>Add=>COM)

然后执行以下操作:

Shell32.ShellClass shell = new Shell32.ShellClass();
shell.MinimizeAll(); // can also do:  shell.UndoMinimizeAll();
或使用后期绑定:

Object shell;
shell = CreateObject("Shell.Application");
shell.MinimizeAll();
现在我不确定您是否可以使用此COM的某些事件(如AllMinimized)

为了防止WinForm应用程序最小化(通过最小化按钮):

您也可以在此处查看:

为了让应用程序知道何时最小化(桌面/最小化所有/所有窗口最小化的最可能事件),您需要检查

this.WindowState

应用程序当前窗体的属性。如果最小化,则应等于

FormWindowsState.最小化

编辑: 试试这个:

foreach (Process proc in Process.GetProcesses()) 
{ 
   /// check proc.StartInfo.ProcessWindowStyle here 
   /// it Gets window state to use when the process is started. 
} 

我完全同意伊恩·博伊德的评论。无论如何,你都不应该试图规避已定义的系统行为。但是,遵守已定义的系统行为,仍然(可能)获取您要查找的内容,您可能希望查看不希望隐藏的主窗口的使用情况。应用程序栏类似于任务栏,除了全屏应用程序运行时,它始终可见。

在COM中添加Microsoft Shell控件和自动化的参考 使用
名称空间外壳32

代码:


在所需状态下调用s32对象。

您好,您可能希望澄清:您现在是说:由于您使用了一些WinAPI调用,因此单击“快速启动”中的图标通常自动隐藏所有窗口的任务栏…是否使应用程序仍然可见?区分是否要“隐藏”应用程序(使其不可见)、应用程序是否(表现为)最顶部的窗口很重要是否,以及您的应用程序在任何情况下是否最小化。@BillW是的,即使单击“显示桌面”按钮,我的应用程序仍然可见,但我的应用程序不是最上面的窗口,我不想隐藏我的应用程序。我只想在我的应用程序中隐藏/显示一个表单。(表单的大小较小,是最上面的窗口)您好,我不打算帮您解决这个问题,但是有一些真正的api大师在这里!我想知道您真正想问的可能是:“当用户单击通常隐藏所有应用程序窗口的“Show Desktop”(显示桌面)图标(实际上是一条捷径)时,如何在运行时通知我的应用程序?”毕竟,如果你能收到通知,你就可以随心所欲地配置应用程序的窗体/窗口。希望这是一条有用的评论;我认为这条评论可能只解决了你所问问题的一部分。我希望你没有得到答案。试图覆盖用户所需的程序正是Microsoft停止提供API的原因访问各种内容。当用户关闭通知区域气球时,不会发出通知,以防开发人员再次尝试显示。程序无法将项目添加到“开始”菜单最常用的程序列表中,因为用户认为其应用程序很重要。您无法锁定桌面上的图标,因为软件会。您无法提供你自己集中注意力,因为程序会。希望没有办法阻止你的应用被隐藏。重复:在做这类工作时是一个非常宝贵的资源,也可能会帮助你。我希望监视其他应用程序窗口状态编辑整个答案,以便更好地显示代码尝试以下操作:
foreach(Process proc in Process.GetProcesses())
{
///在此处检查proc.StartInfo.processWindowsStyle
///它会在进程启动时获取要使用的窗口状态。
}
我已编辑了以前的答案,以格式化并显示您需要的代码。
foreach (Process proc in Process.GetProcesses()) 
{ 
   /// check proc.StartInfo.ProcessWindowStyle here 
   /// it Gets window state to use when the process is started. 
} 
 Shell32.Shell s32 = new Shell32.Shell();