2009-04-24 6 views
12

ho visto questo codice C++ su un forum, che riduce al minimo tutte le finestre aperteMinimizzare tutte le finestre aperte in C#

#define MIN_ALL  419 
#define MIN_ALL_UNDO 416 

int main(int argc, char* argv[]) 
{ 
    HWND lHwnd = FindWindow("Shell_TrayWnd",NULL); 
    SendMessage(lHwnd,WM_COMMAND,MIN_ALL,0); 
    Sleep(2000); 
    SendMessage(lHwnd,WM_COMMAND,MIN_ALL_UNDO,0); 
    return 0; 
} 

Come posso accedere alla funzione API FindWindow e SendMessage e il tipo HWND in C# .NET?

+0

se aiuta, puoi semplicemente mostrare il desktop (non efficacemente minimizzare) usando la classe shell32 – nawfal

risposta

25

PInvoke.net è tuo amico :-)

using System; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 { 
class Program { 
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
    [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true)] 
    static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); 

    const int WM_COMMAND = 0x111; 
    const int MIN_ALL = 419; 
    const int MIN_ALL_UNDO = 416; 

    static void Main(string[] args) { 
     IntPtr lHwnd = FindWindow("Shell_TrayWnd", null); 
     SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero); 
     System.Threading.Thread.Sleep(2000); 
     SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL_UNDO, IntPtr.Zero); 
    } 
} 
} 
+2

Grazie! Questo funziona come un fascino! –

+1

E se volessi ridurre a icona tutte le finestre tranne l'app che sto utilizzando? –

+0

Hamish, se pubblichi la tua domanda come una domanda, non un commento, sono certo che avrai una risposta abbastanza veloce e che la risposta sarà formattata meglio di quanto permetta questa discussione nei commenti. –

6

Il sito www.pinvoke.net ha molte delle informazioni richieste. Per esempio, questo articolo su SendMessage e FindWindow:

http://www.pinvoke.net/default.aspx/user32.SendMessage http://www.pinvoke.net/default.aspx/user32.FindWindow

E 'piuttosto tecnica - ovviamente - ma in fondo si utilizza P/Invoke per chiamare sulle funzioni API FindWindow e SendMessage per realizzare ciò che si desidera. =)

+0

Quando provo ad aggiungere il codice di importazione al mio codice esistente, Visual C# 2008 Express mi dice che prevede "classe, delegato, interfaccia o struttura" invece di IntPtr. –

+0

Il mio male, risolto il problema :) –

+0

Impressionante. Dillo se riesci a farlo funzionare! =) –

4

Un risultato simile può essere ottenuto inviando questi eventi della tastiera per portare il menu popup della barra delle applicazioni e inviarlo alla lettera "M":

public class DesktopHelper 
{ 
    [DllImport("user32.dll")] 
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo); 

    /// <summary> 
    /// Shows the desktop. 
    /// </summary> 
    public static void ShowDesktop() 
    { 
     keybd_event(0x5B, 0, 0, 0); 
     keybd_event(0x4D, 0, 0, 0); 
     keybd_event(0x5B, 0, 0x2, 0); 
    } 
} 
+0

Non proprio la soluzione più ... sicura e semplice, ma stimolante! ;) –

+1

:) È un modo stupido di farlo, ma, dopo tutto: http://support.microsoft.com/kb/194914. – Groo