2009-04-24 25 views
12

vi este código C++ en un foro que minimiza todas las ventanas abiertasminimizar todas las ventanas abiertas en 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; 
} 

¿Cómo puedo acceder a la función API FindWindow y SendMessage y el tipo HWND en C# .NET?

+0

si ayuda, puede simplemente mostrar el escritorio (no es efectivamente un minimizar) usando la clase shell32 – nawfal

Respuesta

25

PInvoke.net es su amigo :-)

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

¡Gracias! ¡Este funciona como un encanto! –

+1

¿Qué sucede si quiero minimizar todas las ventanas a excepción de la aplicación que estoy ejecutando? –

+0

Hamish, si publicas tu pregunta como una pregunta, no un comentario, estoy seguro de que obtendrás una respuesta muy rápido y esa respuesta se formateará mejor de lo que permite esta discusión en los comentarios. –

6

El sitio www.pinvoke.net tiene mucha información que necesita. Por ejemplo, este artículo sobre SendMessage y FindWindow:

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

Es más bien técnico - por supuesto - pero básicamente se utiliza p/invocar para pedir a las funciones de la API FindWindow y SendMessage para lograr lo que desea. =)

+0

Cuando trato de agregar el código de importación a mi código existente, Visual C# 2008 Express me dice que espera "clase, delegado, interfaz o estructura" en lugar de IntPtr. –

+0

Mi mal, resolvió ese problema :) –

+0

Impresionante. ¡Dime si lo haces funcionar! =) –

4

Un resultado similar se puede lograr enviando estos eventos del teclado para que aparezca el menú emergente de la barra de tareas y envíele la letra "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

No es realmente la solución más ... segura y directa, ¡sino inspiradora! ;) –

+1

:) Es una manera tonta de hacerlo, pero, después de todo: http://support.microsoft.com/kb/194914. – Groo

Cuestiones relacionadas