Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
619 views
in Technique[技术] by (71.8m points)

c# - How to minimize/maximize opened Applications

I have list of open Applications. To get this list i have used following code

 internal static class NativeMethods
{
    public static readonly Int32 GWL_STYLE = -16;
    public static readonly UInt64 WS_VISIBLE = 0x10000000L;
    public static readonly UInt64 WS_BORDER = 0x00800000L;
    public static readonly UInt64 DESIRED_WS = WS_BORDER | WS_VISIBLE;

    public delegate Boolean EnumWindowsCallback(IntPtr hwnd, Int32 lParam);

    public static List<WindowWrapper> GetAllWindows()
    {
        List<WindowWrapper> windows = new List<WindowWrapper>();
        StringBuilder buffer = new StringBuilder(100);
        EnumWindows(delegate(IntPtr hwnd, Int32 lParam)
        {
            if ((GetWindowLongA(hwnd, GWL_STYLE) & DESIRED_WS) == DESIRED_WS)
            {
                GetWindowText(hwnd, buffer, buffer.Capacity);
                WindowWrapper wnd = new WindowWrapper();
                wnd.handle = hwnd;
                wnd.title = buffer.ToString();
                windows.Add(wnd);
            }
            return true;
        }, 0);

        return windows;
    }

    [DllImport("user32.dll")]
    static extern Int32 EnumWindows(EnumWindowsCallback lpEnumFunc, Int32 lParam);

    [DllImport("user32.dll")]
    public static extern void GetWindowText(IntPtr hWnd, StringBuilder lpString, Int32 nMaxCount);

    [DllImport("user32.dll")]
    static extern UInt64 GetWindowLongA(IntPtr hWnd, Int32 nIndex);
}

public class WindowWrapper : IWin32Window
{
    internal IntPtr handle;
    internal String title;

    public IntPtr Handle
    {
        get { return handle; }
    }

    public String Title
    {
        get { return title; }
    }
}

to call this i used following code

foreach (var wnd in NativeMethods.GetAllWindows())
       {
               string caption = wnd.title;
               string handle = wnd.Handle
               // Add this caption and handle to list
       }

Now, User will select any of the opened window from the list and my task is to read caption of the selected window, get handle of process and maximize/minimize or close window. How can I do this.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use findwindowbycaption to get the handle then maximize or minimize with showwindow

private const int SW_MAXIMIZE = 3;
private const int SW_MINIMIZE = 6;
// more here: http://www.pinvoke.net/default.aspx/user32.showwindow

[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

Then in your code you use this:

IntPtr hwnd = FindWindowByCaption(IntPtr.Zero, "The window title");
ShowWindow(hwnd, SW_MAXIMIZE);

Although it seems you already have the window handle by using EnumWindows in that case you would only need:

ShowWindow(windows[i].handle, SW_MAXIMIZE);

i is the index of the window.


to close the window you will use:

[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool DestroyWindow(IntPtr hwnd);

in the code:

DestroyWindow(hwnd) //or DestroyWindow(windows[i].handle)

this is the unmanaged version of system.windows.forms.form.close()


or you can use:

Process [] proc Process.GetProcessesByName("process name");
proc[0].Kill();

or you can use:

static uint WM_CLOSE = 0x0010;
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

in code:

PostMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...