【问题标题】:Minimizing all open windows in C#在 C# 中最小化所有打开的窗口
【发布时间】:2010-10-21 13:36:23
【问题描述】:

我在一个最小化所有打开的窗口的论坛上看到了这个 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#.net 中访问 FindWindow 和 SendMessage API 函数和 HWND 类型?

【问题讨论】:

  • 如果有帮助,您可以使用 shell32 类显示桌面(实际上不是最小化)

标签: c# .net window minimize


【解决方案1】:

PInvoke.net 是你的朋友 :-)

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);
    }
}
}

【讨论】:

  • 如果我想最小化除我正在运行的应用程序之外的所有窗口怎么办?
  • Hamish,如果您将问题作为问题而不是评论发布,我相信您会很快得到答案,并且该答案的格式会比 cmets 中的讨论更好。
【解决方案2】:

网站 www.pinvoke.net 有很多您需要的信息。比如这篇关于 SendMessage 和 FindWindow 的文章:

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

这是相当技术性的 - 当然 - 但基本上你使用 p/invoke 来调用 FindWindow 和 SendMessage API 函数来完成你想要的。 =)

【讨论】:

  • 当我尝试将导入代码添加到现有代码中时,Visual C# 2008 Express 告诉我它需要“类、委托、接口或结构”而不是 IntPtr。
【解决方案3】:

通过发送这些键盘事件来带来任务栏弹出菜单并发送字母“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);
    }
}

【讨论】:

【解决方案4】:

我之前写过关于如何使用 C# 中的 P/Invoke 最小化和最大化的博客: http://improve.dk/minimizing-and-maximizing-windows/

【讨论】:

  • @khargoosh 抱歉 - 已修复!
【解决方案5】:

不完全是最简单的方法,但手动方法是调用 C++ 实现。 http://pinvoke.net 帮助:

findwindow搜索结果:http://pinvoke.net/search.aspx?search=findwindow&namespace=[All]

大约第四个结果对您的情况有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2018-08-24
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多