2013-07-26 2 views
1
proc.MainWindowTitle.Contains("e") 

Как один получить окна заголовки всех текущих окон, содержащих «е» открыть вместо того, чтобы только главное окно с помощью «MainWindowTitle» и хранить их в массив строк?гр заголовки окон # Get процесс

EDIT:

 string[] toClose = {proc.MainWindowTitle}; 
       for (int i = 0; i < toClose.Length; i++) 
       { 
        string s = toClose[i]; 
        int hwnd = 0; 

        hwnd = FindWindow(null, s); 

        //send WM_CLOSE system message 
        if (hwnd != 0) 
         SendMessage(hwnd, WM_CLOSE, 0, IntPtr.Zero); 
+0

Пожалуйста, ознакомьтесь с этим связанным вопросом (и принятым ответом). http://stackoverflow.com/questions/7268302/get-the-names-of-all-open-windows-not-process-name. Думаю, это поможет вам. – HuorSwords

+0

Если вы хотите получить все окна, принадлежащие этому процессу, вам нужно заглянуть в [EnumChildWindows] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633494 (v = vs.85)) .aspx) и вызовите [SendMessage] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950 (v = vs.85) .aspx) на них с помощью WM_GETTEXT Msg. – KappaG3

ответ

2

Вам нужно будет перебирать список процессов (могут быть сделаны с

Process[] processlist = Process.GetProcesses();)

с foreach(Process in processlist)

и написать Process.MainWindowTitle к массив. Попробуйте это :)

+0

Пробовал это, но он возвращает только один за раз не все –

+0

Как вы добавляете его в массив? – MaxMarchuk

+0

отредактировал OP, как я это делаю, но он получает только одно окно за один раз @MaxMarchuk –

2

Фрагмент кода

string[] result = new string[50]; 
int count = 0; 
Process[] processes = Process.GetProcesses(); 
foreach(var process in processes) 
{ 
    if (process.MainWindowTitle 
       .IndexOf("e", StringComparison.InvariantCulture) > -1) 
    { 
     result[count] = process.MainWindowTitle; 
     count++; 
    } 
} 

Пожалуйста, ознакомьтесь с question (и принятым ответом), который ведет мой ответ.

Edit:

Если я правильно понимаю, вы хотите получить де список процессов основных названий окон.

Анализ вашего кода ниже, переменная toClose всегда сохраняет одно название: значение proc.MainWindowTitle.

string[] toClose = { proc.MainWindowTitle }; 

Вы должны получить каждый заголовок окна используя foreach заявление моего первоначального ответа. Затем вы должны использовать переменную result в предлагаемом решении вместо переменной toClose на вашей части кода.

+0

отредактировал OP с текущим кодом, который не кажется работать –

3
public static class MyEnumWindows 
{ 
    private delegate bool EnumWindowsProc(IntPtr windowHandle, IntPtr lParam); 

    [DllImport("user32")] 
    private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); 

    [DllImport("user32.dll")] 
    private static extern bool EnumChildWindows(IntPtr hWndStart, EnumWindowsProc callback, IntPtr lParam); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam, uint fuFlags, uint uTimeout, out IntPtr lpdwResult); 

    private static List<string> windowTitles = new List<string>(); 

    public static List<string> GetWindowTitles(bool includeChildren) 
    { 
     EnumWindows(MyEnumWindows.EnumWindowsCallback, includeChildren ? (IntPtr)1 : IntPtr.Zero); 
     return MyEnumWindows.windowTitles; 
    } 

    private static bool EnumWindowsCallback(IntPtr testWindowHandle, IntPtr includeChildren) 
    { 
     string title = MyEnumWindows.GetWindowTitle(testWindowHandle); 
     if (MyEnumWindows.TitleMatches(title)) 
     { 
      MyEnumWindows.windowTitles.Add(title); 
     } 
     if (includeChildren.Equals(IntPtr.Zero) == false) 
     { 
      MyEnumWindows.EnumChildWindows(testWindowHandle, MyEnumWindows.EnumWindowsCallback, IntPtr.Zero); 
     } 
     return true; 
    } 

    private static string GetWindowTitle(IntPtr windowHandle) 
    { 
     uint SMTO_ABORTIFHUNG = 0x0002; 
     uint WM_GETTEXT = 0xD; 
     int MAX_STRING_SIZE = 32768; 
     IntPtr result; 
     string title = string.Empty; 
     IntPtr memoryHandle = Marshal.AllocCoTaskMem(MAX_STRING_SIZE); 
     Marshal.Copy(title.ToCharArray(), 0, memoryHandle, title.Length); 
     MyEnumWindows.SendMessageTimeout(windowHandle, WM_GETTEXT, (IntPtr)MAX_STRING_SIZE, memoryHandle, SMTO_ABORTIFHUNG, (uint)1000, out result); 
     title = Marshal.PtrToStringAuto(memoryHandle); 
     Marshal.FreeCoTaskMem(memoryHandle); 
     return title; 
    } 

    private static bool TitleMatches(string title) 
    { 
     bool match = title.Contains("e"); 
     return match; 
    } 

}