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

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

你好,你可能需要澄清一下:你是不是说因为使用了一些WinAPI调用,点击任务栏“快速启动”中的图标...通常会自动隐藏所有窗口...但你的应用程序仍然可见?重要的是要区分你是在谈论“隐藏”你的应用程序(使其不可见),你的应用程序是否(表现为)“最顶层窗口”,以及你的应用程序是否在任何情况下被最小化。 - BillW
@BillW 是的,即使单击“显示桌面”按钮,我的应用程序仍然可见,但我的应用程序不是最顶层的窗口,我不想隐藏我的应用程序。我只想在我的应用程序中隐藏/显示一个表单(该表单是一个较小的顶层窗口)。 - Suriyan Suresh
嗨,很抱歉我不能帮你解决这个问题,但是在Stack Overflow上有一些真正的API专家!我想知道你真正想问的是不是这样:“当用户点击‘显示桌面’图标(实际上是一个隐藏所有应用程序窗口的快捷方式)时,如何在运行时通知我的应用程序?”毕竟,如果你能收到通知,你就可以根据需要配置你的应用程序的表单/窗口。希望这个评论对你有帮助;我认为这个评论可能只回答了你提问的一部分。 - BillW
5
希望你不要得到这个问题的答案。程序试图覆盖用户想要的内容,这正是为什么微软停止向各种 API 提供访问权限的原因。当用户关闭通知区域气泡时,没有通知,以防开发者再次显示它。程序无法将项目添加到开始菜单中最常用的程序列表中,因为人们认为他们的应用程序很重要。你不能锁定桌面上的图标,因为软件可能会这样做。你不能让自己获得焦点,因为程序可能会这样做。希望没有办法防止你的应用被隐藏。 - Ian Boyd
检测所有从C#应用程序最小化的窗口 - serhio
5个回答

2
以下内容可能会帮助您入门。这只是一个标准表单,其中包含一个ListBox(命名为listMessages)。当我执行桌面最小化/显示所有操作时,该表单捕获WM_SIZE消息,并将Message m值输出到ListBox中。您的表单可能不会响应典型的最小化和最大化事件,但它应该从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);
            }
        }
    }
}

1
http://www.pinvoke.net/index.aspx 是一个非常宝贵的资源,当涉及到这种类型的工作时,它可以帮助您更进一步。 - Dave Jellison

1

我完全同意Ian Boyd的评论。绝不能试图规避定义好的系统行为。然而,为了遵守定义好的系统行为并且仍然(也许)得到你想要的结果,你可能想要研究一下使用应用栏来作为你不想隐藏的主窗口。应用栏就像任务栏一样,在全屏应用程序运行时除外,它始终可见。


1
在COM中添加Microsoft Shell Controls And Automation的引用 使用命名空间Shell32
代码:
 Shell32.Shell s32 = new Shell32.Shell(); 

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


0

所以...为了最小化所有窗口,您可以使用以下方法:

将“Microsoft Shell Controls And Automation”COM引用添加到您的项目中(引用=>添加=>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应用程序最小化(通过最小化按钮):

void Form1_Resize(object sender, System.EventArgs e) // Handles Form1.Resize
{
    if (this.WindowState == FormWindowState.Minimized) 
        this.WindowState = FormWindowState.Normal;
}

您也可以在这里查看: http://pinvoke.net/default.aspx/user32.EnumDesktopWindows


0

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

this.WindowState

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

FormWindowState.Minimized

编辑: 试试这个:

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

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo_properties.aspx


我希望监控其他应用程序的窗口状态。 - Suriyan Suresh
试一下这个: <br> foreach (Process proc in Process.GetProcesses()) <br> { <br> /// 在这里检查proc.StartInfo.ProcessWindowStyle <br> /// 它获取启动进程时要使用的窗口状态。 <br> } <br>http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo_properties.aspx - AceMark
我已经编辑了我的先前回答,以更好地格式化和显示您所需的代码。 - AceMark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接