Минимизация всех открытых окон в C # - PullRequest
13 голосов
/ 24 апреля 2009

Я видел этот код 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;
}

Как получить доступ к API-функциям FindWindow и SendMessage и типу HWND в C # .net?

Ответы [ 5 ]

27 голосов
/ 24 апреля 2009

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);
    }
}
}
6 голосов
/ 24 апреля 2009

На сайте 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, чтобы выполнить то, что вы хотите. =)

4 голосов
/ 24 апреля 2009

Аналогичного результата можно достичь, отправив эти события клавиатуры, чтобы вызвать всплывающее меню панели задач и отправить ему букву «М»:

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);
    }
}
3 голосов
/ 24 апреля 2009

Ранее я писал о том, как минимизировать и максимизировать использование P / Invoke из C #: http://improve.dk/minimizing-and-maximizing-windows/

1 голос
/ 24 апреля 2009

Не совсем простой способ, но ручной способ - вызвать реализацию C ++. http://pinvoke.net помогает:

результаты поиска в окне поиска: http://pinvoke.net/search.aspx?search=findwindow&namespace=[All]

примерно четвертый результат в вашем случае поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...