2010-01-02 61 views
6

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

+0

嗨,你可能会想澄清:你说的权利现在:由于您使用了一些WinAPI调用,单击任务栏“快速启动”中的图标...通常会自动隐藏所有窗口...会让您的应用程序仍然可见?重要的是区分你是否在谈论“隐藏”你的应用程序(使之不可见),你的应用程序是否是(作为)“最上面的窗口”,以及你的应用程序是否在任何情况下最小化。 – BillW 2010-01-02 13:40:14

+0

@BillW是我的应用程序是可见的,即使点击显示桌面按钮后,但我的应用程序不是最顶层的窗口,我不想隐藏我的应用程序。我只想在应用程序中隐藏/显示一个表单。 (窗体的尺寸较小,这是最上方的窗口) – 2010-01-02 13:46:28

+0

嗨,我不能帮助你,但是这里有一些真正的api大师!我想知道你真正想问的可能是这样的:“如何在运行时通知我的应用程序...当用户点击”显示桌面“图标时(这是一个快捷方式,实际上)通常隐藏所有的应用程序窗口?“毕竟,如果你能得到通知,你可以随意配置你的应用程序的窗体/窗口。希望这是一个有用的评论;这个评论可能只涉及你问的一部分,我想。 – BillW 2010-01-02 14:30:35

回答

2

以下内容可能会帮助您开始。这只是一个带有ListBox的标准表单(名为listMessages)。当我执行桌面最小化/ showall时,表单捕获WM_SIZE消息并将消息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); 
      } 
     } 
    } 
} 
+1

http://www.pinvoke.net/index.aspx是一个非常宝贵的资源,当谈到做这种类型的工作,并可能进一步推动你。 – 2010-01-03 12:45:33

0

所以...:

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

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

+0

我要监控的其他应用程序的窗口状态 – 2010-01-12 04:01:32

+0

编辑的全部答案,以显示代码更好 尝试了这一点:
的foreach(PROC过程中Process.GetProcesses())
{
///检查PROC .StartInfo.ProcessWindowStyle here
/// it获取进程启动时使用的窗口状态。
}
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo_properties.aspx – AceMark 2010-01-12 06:59:32

+0

我编辑了我以前的答案格式化并显示您需要更好的代码。 – AceMark 2010-01-12 08:23:20

1

我完全伊恩·博伊德的评论表示赞同。绝不应该试图绕过定义的系统行为。但是,要遵守已定义的系统行为并仍然(可能)获得所需内容,则可能需要考虑使用appbars作为您不想隐藏的主窗口。应用程序栏就像任务栏,除了全屏应用程序正在运行时以外,它始终保持可见状态。

1

添加的Microsoft Shell Controls And Automation参考在COM 使用Namespace Shell32

代码:你期望的状态

Shell32.Shell s32 = new Shell32.Shell(); 

呼叫S32对象..