2009-04-24 9 views
12

tôi thấy C++ mã này trên một diễn đàn mà giảm thiểu tất cả các cửa sổ đang mởGiảm thiểu tất cả các cửa sổ đang mở trong 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; 
} 

Làm thế nào tôi có thể truy cập các chức năng API FindWindow và SendMessage và loại HWND trong C# .net?

+0

nếu có ích, bạn có thể chỉ hiển thị máy tính để bàn (không hiệu quả giảm thiểu) bằng cách sử dụng lớp shell32 – nawfal

Trả lời

25

PInvoke.net là bạn của bạn :-)

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

Cảm ơn! Cái này hoạt động giống như một sự quyến rũ! –

+1

điều gì xảy ra nếu tôi muốn thu nhỏ tất cả các cửa sổ ngoại trừ ứng dụng mà tôi đang chạy? –

+0

Hamish, nếu bạn đăng câu hỏi của mình dưới dạng câu hỏi, không phải là nhận xét, tôi chắc chắn bạn sẽ nhận được câu trả lời khá nhanh và câu trả lời đó sẽ được định dạng tốt hơn thảo luận này trong các nhận xét cho phép. –

6

Trang web www.pinvoke.net có rất nhiều thông tin bạn cần. Ví dụ, bài viết này trên SendMessage và FindWindow:

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

Đó là thay vì kỹ thuật - dĩ nhiên - nhưng về cơ bản bạn sử dụng p/gọi để gọi về chức năng FindWindow và SendMessage API để thực hiện những gì bạn muốn. =)

+0

Khi tôi thử thêm mã nhập vào mã hiện có của mình, Visual C# 2008 Express cho tôi biết rằng nó sẽ là "class, delegate, interface hoặc struct" thay vì IntPtr. –

+0

Của tôi xấu, giải quyết vấn đề đó :) –

+0

Tuyệt vời. Làm cho biết nếu bạn nhận được nó để làm việc! =) –

4

Một kết quả tương tự có thể đạt được bằng cách gửi các sự kiện bàn phím này để hiển thị menu bật lên trên Thanh tác vụ và gửi chữ cái "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

Không thực sự là giải pháp an toàn và thẳng thắn nhất, nhưng truyền cảm hứng! ;) –

+1

:) Đó là một cách ngớ ngẩn để làm điều đó, nhưng, sau khi tất cả: http://support.microsoft.com/kb/194914. – Groo