如何最小化/最大化打开的应用程序

我有打开的应用程序列表。 要获得此列表,我使用了以下代码

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 GetAllWindows() { List windows = new List(); 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; } } } 

我称之为使用以下代码

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

现在,用户将从列表中选择任何打开的窗口,我的任务是读取所选窗口的标题,获取进程处理并最大化/最小化或关闭窗口。 我怎样才能做到这一点。

您可以使用findwindowbycaption获取句柄,然后使用findwindowbycaption最大化或最小化

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

然后在你的代码中你使用这个:

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

虽然在这种情况下您似乎已经使用EnumWindows获得了窗口标题,但您只需要:

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

i是窗口的索引。

关闭你将使用的窗口:

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

在代码中:

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

这是system.windows.forms.form.close()的非托管版本

或者您可以使用:

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

或者您可以使用:

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

在代码中:

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

您可以使用本机方法ShowWindow with SW_MAXIMIZE,SW_MINIMIZE for ncmdShow查看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); 

你可以使用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 ); 

并且它更好并且使用

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

打开窗户

我在Porcess中测试了MainWindowTitle,它有助于在窗口上搜索它的标题。

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