2013-09-06 23 views
7

Mam listę otwartych aplikacji. Aby dostać się do tej listy Użyłem następujący kodJak zminimalizować/zmaksymalizować otwarte aplikacje

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

zadzwonić to użyłem następującego kodu

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

Teraz, Użytkownik będzie wybrać dowolny z otwartym oknie z listy, a moim zadaniem jest, aby przeczytać napis wybranego okna, uzyskaj uchwyt procesu i zmaksymalizuj/zminimalizuj lub zamknij okno. Jak mogę to zrobić.

Odpowiedz

10

Można użyć findwindowbycaption dostać uchwyt następnie maksymalizacji lub minimalizacji z 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); 

Następnie w kodzie użyć tego:

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

Choć wydaje się, że już mają podpisów pod Windowsem przy użyciu EnumWindows w takim przypadku potrzebujesz:

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

i to indeks okna.

aby zamknąć okno można użyć:

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

w kodzie:

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

to jest niekontrolowana wersja system.windows.forms.form.close()

lub można użyć:

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

lub można użyć:

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

w kodzie:

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

Ok, dziękuję. Teraz, aby zamknąć okno, co powinienem kod –

+0

zaktualizowałem odpowiedź –

+0

DestroyWindow/CloseWindow nie zamyka okna, dlaczego? –

5

Można użyć metody rodzimej ShowWindow z SW_MAXIMIZE, SW_MINIMIZE dla ncmdShow Spójrz na 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); 
+0

może mi Pani powiedzieć, jak korzystać z tego? –

+0

Twoja odpowiedź jest właściwa.czy możemy uzyskać uchwyt lub okno, jeśli znamy tylko jego podpisy? –

+0

Masz uchwyty w WindowWrapper, byłoby bardziej wydajne przechowywanie ich, ponieważ podpis okna może być zmieniany przez samą aplikację działającą w tle. –

2

można użyć 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); 

i jest to lepsze i używać

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

, aby otworzyć okno

Mam test MainWindowTitle w Porcess i pomaga on wyszukiwać w oknie z podanym napisem.

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

czy znasz kod, aby uzyskać dostęp do okna, jeśli znamy tylko jego podpis –

+2

zobacz edytuj help – Alyafey

+0

Jedyny sposób, który działałby dla mojej aplikacji WPF, dzięki! – Lee