How to minimize / maximize open applications

I have a list of open applications. To get this list, I used the 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 the following code

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

Now the user will select any of the open windows from the list, and my task is to read the title of the selected window, get the process handle and maximize / minimize or close the window. How can i do this.

+8
c #
source share
3 answers

You can use findwindowbycaption to get a 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, ShowWindowCommands nCmdShow); 

Then in your code you use this:

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

Although it seems that you already have window captions using EnumWindows , in this case you only need:

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

i is the window index.

to close the window that you will use:

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

in code:

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

this is an 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); 
+10
source share

You can use the ShowWindow native method with SW_MAXIMIZE, SW_MINIMIZE for ncmdShow. Take a look at http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx

 private const int SW_MAXIMIZE = 3; private const int SW_MINIMIZE = 6; [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow); // in your code ShowWindow(wnd.Handle, SW_MAXIMIZE); 
+5
source share

you can use showwindowAsync

 private const int SW_SHOWNORMAL = 1; private const int SW_SHOWMINIMIZED = 2; private const int SW_SHOWMAXIMIZED = 3; [DllImport("user32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); ShowWindowAsync(wnd.Handle, SW_SHOWMINIMIZED ); 

and itโ€™s better and use

  var openWindows = Process.GetProcesses().Where(process=> String.IsNullOrEmpty(process.MainWindowTitle)==false); 

to open open windows

I have a MainWindowTitle test in Porcess and it helps to search in a window, given its signature.

  var handles = Process.GetProcesses().Where(x => x.MainWindowTitle == "Untitled - Notepad").Select(y=>y.Handle).ToList(); 
+2
source share

All Articles