proc.MainWindowTitle.Contains("e")
如何使用“MainWindowTitle”获取包含“e”的所有当前窗口的窗口标题而不是主窗口,并将它们存储到字符串数组中?
修改
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 :(得分:3)
代码段
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(和接受的答案)。
修改强>
如果我理解正确,您想要检索进程主窗口标题列表。
分析下面的代码,toClose
变量始终存储一个标题:proc.MainWindowTitle
值。
string[] toClose = { proc.MainWindowTitle };
您必须使用原始答案的foreach
语句检索每个窗口标题。然后,您必须在建议的解决方案中使用result
变量,而不是代码中的toClose
变量。
答案 1 :(得分: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;
}
}
答案 2 :(得分:2)
您需要遍历流程列表(可以使用
进行) Process[] processlist = Process.GetProcesses();
)
foreach( Process in processlist )
并将Process.MainWindowTitle
写入数组。
试试看:)