2010-01-02 9 views
6

Wie benachrichtigen Sie meine Anwendung, wenn Sie den Desktop anzeigen/Minimieren Sie alle/alle Fenster minimiert mit C#Wie kann ich meine Anwendung benachrichtigen, wenn sie den Desktop anzeigen/alle/alle minimiert minimieren?

+0

Hallo, könnten Sie klären wollen: sagen Sie richtig Nun, da Sie bei einigen WinAPI-Aufrufen auf das Symbol in der "Schnellstartleiste" der Taskleiste klicken, das normalerweise alle Fenster automatisch verdeckt, bleibt Ihre Anwendung noch sichtbar? Es ist wichtig zu unterscheiden, ob Sie Ihre Anwendung "verstecken" (nicht sichtbar machen), ob Ihre Anwendung sich wie ein "oberstes Fenster" verhält oder nicht und ob Ihre Anwendung unter allen Umständen jemals minimiert wurde. – BillW

+0

@BillW Ja meine Anwendung ist sichtbar, auch nachdem die Desktop-Schaltfläche geklickt wurde, aber meine Anwendung ist nicht das oberste Fenster, ich möchte meine Anwendung nicht verbergen. Ich möchte nur ein Formular in meiner Anwendung verstecken/anzeigen. (das Formular ist kleiner, das ist das oberste Fenster) –

+0

Hallo, ich werde dir nicht dabei helfen können, aber es gibt einige echte api-Gurus auf SO! Ich frage mich, ob das, was Sie wirklich fragen, das folgende wäre: "Wie kann ich meine Anwendung benachrichtigt bekommen ... zur Laufzeit ... wenn der Benutzer auf das Symbol" Desktop anzeigen "klickt (es ist eine Abkürzung, unter der (wirklich), die normalerweise alle Anwendungsfenster verbirgt? " Wenn Sie eine Benachrichtigung erhalten, können Sie dann die Formulare/Fenster Ihrer Anwendung beliebig konfigurieren. Hoffe das ist ein hilfreicher Kommentar; Dieser Kommentar könnte nur einen Teil von dem betreffen, was Sie fragen, denke ich. – BillW

Antwort

2

Die folgenden könnten Sie beginnen. Dies ist nur ein Standardformular mit einer ListBox (namens listMessages). Wenn ich einen Desktop minimize/showall ausführe, fängt das Formular die WM_SIZE-Nachrichten ab und gibt die Message m-Werte an die ListBox aus. Ihr Formular reagiert möglicherweise nicht auf typische Minimierungs- und Maximierungsereignisse, aber es sollte diese Nachrichten von der Windows-Nachrichtenpumpe empfangen. Soweit Erkennen, ob irgendein ein anderes Fenster, das ist ein bisschen mehr beteiligt gezeigt wurde, sondern kann auch durchgeführt werden ....

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 ist eine unschätzbare Ressource, wenn es darum geht tun diese Art von Arbeit und können Sie auch weiter. –

0

So ..., um alle Fenster zu minimieren Sie die folgende verwenden:

Fügen Sie dem Projekt die COM-Referenz "Microsoft Shell Controls And Automation" hinzu (References => Add => COM).

dann tun die Folowing:

Shell32.ShellClass shell = new Shell32.ShellClass(); 
shell.MinimizeAll(); // can also do: shell.UndoMinimizeAll(); 

oder mit der späten Bindung:

Object shell; 
shell = CreateObject("Shell.Application"); 
shell.MinimizeAll(); 

Jetzt bin ich nicht sicher, ob Sie einige Ereignisse dieser COM (wie AllMinimized) verwenden können. ..

Um zu verhindern, dass eine WinForm-Anwendung minimiert (über die Schaltfläche Minimieren):

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

Sie können auch einen Blick hier: http://pinvoke.net/default.aspx/user32.EnumDesktopWindows

0

Damit Sie Anwendung wissen, wann es minimiert wird (das wahrscheinlichste Ereignis, wie Desktop/minimieren alle/alle minimierten Fenster, Sie müssen überprüfen Sie auf der

this.WindowState

Eigentum der aktuellen Form der Anwendung. wenn es minimiert wird, dann sollte es gleich zu

FormWindowState.Minimized

Editiert: versuchen this out:

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

ich wünsche, andere Anwendungen überwachen –

+0

Fenster Zustand die ganze Antwort bearbeitet, die Codes besser zu zeigen versuchen, dies aus:
foreach (Process proc in Process.GetProcesses())
{
/// Check proc .StartInfo.ProcessWindowStyle hier
/// it Ruft den Fensterstatus auf, der verwendet werden soll, wenn der Prozess gestartet wird.
}
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo_properties.aspx – AceMark

+0

Ich habe meine Antwort formatiert werden bearbeitet und die Codes zeigen Sie besser brauchen. – AceMark

1

ich mit Ian Boyd Kommentar vollständig zustimmen. Auf keinen Fall sollten Sie versuchen, das definierte Systemverhalten zu umgehen. Um sich jedoch an das definierte Systemverhalten zu halten und dennoch (vielleicht) das zu bekommen, wonach Sie suchen, sollten Sie sich die Verwendung von appbars für Ihr Hauptfenster ansehen, das nicht versteckt werden soll. Eine Appbar ist wie die Taskleiste und bleibt immer sichtbar, außer wenn eine Vollbildanwendung ausgeführt wird.

1

hinzufügen Referenz von Microsoft Shell Controls And Automation In COM Verwenden Namespace Shell32

Code:

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

Anruf s32-Objekt in Ihrem gewünschten Zustand ..